Normalizerを試してみます

ゲッターを持つPHPオブジェクトを配列に変換する Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer を試してみます。

こちら には

GetSetMethodNormalizer はもとから壊れています。
循環参照のあるオブジェクトを処理させると、ゲッターメソッドを呼び出した際に無限ループが発生します。
実際のユースケースにしたがって、独自の normalizer を作って利用してください。

とあるのでご注意を。

コマンド実装コード

EntityオブジェクトをURLエンコードされたクエリ文字列に変換してみます。

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
use xxxxx\SampleBundle\Entity\Mercury;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

class TestNormalizerCommand extends ContainerAwareCommand
{

    protected function configure()
    {
        $this->setName('sample:normalizer');
        $this->setDescription('Normalizer/GetSetMethodNormalizer を試します');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $dt = new \DateTime('-3 days');

        for ($i = 1; $i <= 3; ++$i) {

            $mercury = new Mercury();
            $mercury->setRecordedDate($dt->format('Y-m-d'));
            $mercury->setMercury(rand(15, 35));

            $normalizer = new GetSetMethodNormalizer();
            $query = http_build_query($normalizer->normalize($mercury));
            echo $query . PHP_EOL;

            $dt->modify('+1 day');
        }
    }
}

実行

$ php app/console sample:normalizer
recordedDate=2014-06-19&mercury=17
recordedDate=2014-06-20&mercury=20
recordedDate=2014-06-21&mercury=32

キー名を指定できないかなぁ...