Symfony, generowanie danych w zależności od parametru.

0

Witam,
Dopiero zaczynam z symfony, a chciałbym robić wszystko zgodnie z dobrymi praktykami.

Zrobiłem sobie obiekt stdclass(może być też zwykły array), w którym przechowuje dane, następnie z tych danych chciałbym generować JSON na kilka różnych sposobów w zależności od wybranego parametru i na tym problem się kończy.
Powinienem stworzyć sobie zwykłą klasę a w niej funkcje(z parametrem obiektu z danymi) odpowiedzialne za generowanie json i wywoływać funkcję odpowiednią dla potrzebnego json? Czy może jest jakiś inne rozwiązanie, które będzie bardziej przejrzyste?

Pozdrawiam

0

Na kilka różnych sposobów te same dane? Hmm...

<?php

class Foo // czyli Twój stdClass, mozesz sobie stworzyć własną klasę zamiast używac stdClass
{
	private $someStr;

	public function __construct(string $someStr)
	{
		$this->someStr = $someStr;
	}

	public function getSomeStr(): string
	{
		return $this->someStr;
	}
}

class UppercaseRepresentationOfFoo implements \JsonSerializable
{
	private $foo;

	public function __construct(Foo $foo)
	{
		$this->foo = $foo;
	}

	public function jsonSerialize(): array
	{
		return [
			'someStr' => strtoupper($this->foo->getSomeStr()),
		];
	}
}

class LowercaseRepresentationOfFoo implements \JsonSerializable
{
	private $foo;

	public function __construct(Foo $foo)
	{
		$this->foo = $foo;
	}

	public function jsonSerialize(): array
	{
		return [
			'someStr' => strtolower($this->foo->getSomeStr()),
		];
	}
}

class FooTransformer
{
	public const UPPERCASE = 'uppercase';

	public const LOWERCASE = 'lowercase';

	public static function transform(Foo $foo, string $type): \JsonSerializable
	{
		switch ($type)
		{
			case self::UPPERCASE:
				return new UppercaseRepresentationOfFoo($foo);

			case self::LOWERCASE:
				return new LowercaseRepresentationOfFoo($foo);

			default:
				throw new \InvalidArgumentException(sprintf('Nieznany typ %s', $type));
		}
	}
}

$foo = new Foo('testowy string');
$uppercaseRepresentation = FooTransformer::transform($foo, FooTransformer::UPPERCASE);
$lowercaseRepresentation = FooTransformer::transform($foo, FooTransformer::LOWERCASE);

echo json_encode($uppercaseRepresentation); // {"someStr":"TESTOWY STRING"} 
echo json_encode($lowercaseRepresentation); // {"someStr":"testowy string"}

1 użytkowników online, w tym zalogowanych: 0, gości: 1