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, botów: 0