TwigでJSONデコードしたい

Extending Twig - Documentation - Twig - The flexible, fast, and secure PHP template engine

Twigを拡張して json_decode というフィルターを作ってあげる。

<?php

// ...

class MyExtension extends \Twig_Extension
{

    // ...

    public function getFilters()
    {
        return [
            new \Twig_Filter('json_decode', [$this, 'jsonDecodeFilter']),
        ];
    }

    public function jsonDecodeFilter($json = null)
    {
        if (!$json) {
            return null;
        }
        return json_decode($json, true);
    }

    // ...
}

こんな形で使用する。

{{ jsonString | json_decode }}

参考。

stackoverflow.com

【Twig】対象の文字列が特定の文字列を含んでいるかどうかを判定する

in 演算子を使う。

Twig for Template Designers - Documentation - Twig - The flexible, fast, and secure PHP template engine

{# returns true #}

{{ 1 in [1, 2, 3] }}

{{ 'cd' in 'abcde' }}

見ての通り in 演算子は配列でも文字列でも使うことができる。便利。

ちなみに、含まないことを判定するなら not in を使うとよい。

{# returns false #}

{{ 'cd' not in 'abcde' }}

{# 以下と同じ #}

{{ not ('cd' in 'abcde') }}

【Symfony】Formでsubmitされたあとの値を拾って書き換える

symfony.com

Formイベントをハンドリングして値を書き換えることができる。

イベントは何種類かあるのだけど、FormEvents::PRE_SUBMITFormEvents::SUBMIT かで値を書き換えようとして、FormEvents::SUBMIT は値書き換えできないんだった、的なことに気づくことがあるので、ついでに書いておく。

<?php
// ...
class MyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, [
                'label' => '名前'
            ])
            ->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'onPreSubmit'])
            ->addEventListener(FormEvents::SUBMIT, [$this, 'onSubmit'])
        ;
    }

    // ...

    public function onPreSubmit(FormEvent $event)
    {
        // OK: ここではPOST値を変えることができる
        $data = $event->getData();
        $data['name'] = '田中太郎';
        $event->setData($data);
    }

    public function onSubmit(FormEvent $event)
    {
        // NG: ここではPOST値を変えることができない
        $data = $event->getData();
        $data['name'] = '田中太郎';
        $event->setData($data);
    }
}