🎻

[Symfony] Entity Listenerで特定のプロパティが更新されたときだけ何かする

2020/04/27に公開

小ネタです。

Symfonyでエンティティが変更されたときに何かしたい場合、DoctrineのEntity Listenerが便利です。(詳しくは こちらの記事 をご参照ください)

エンティティの中でも特定のプロパティが変更されたときにだけ何かしたいというケースはよくあると思いますが、Entity Listenerでどうすれば実現できるでしょうか。

結論

PreUpdateEventArgs には hasChangedField($fieldName) というメソッドが生えていて、これを使ってプロパティが変更されたかどうかを知ることができます👍

例えば以下のような感じで使えばよいでしょう。

class FooListener
{
    public function preUpdate(Foo $foo, PreUpdateEventArgs $event)
    {
        if ($event->hasChangedField('state')) {
            $foo->setStateUpdatedAt(new \DateTime());
        }
    }
}

他にも

PreUpdateEventArgs には他にもいくつか便利なメソッドがあって、 getOldValue($fieldName)getNewValue($fieldName) で「変更前の値」と「変更後の値(これからなろうとしている値)」を取得できたり、 setNewValue($fieldName, $value) で変更後の値を差し替えたりもできます。

詳しくは こちらのドキュメント をご参照ください。

まとめ

  • Symfony(Doctrine)のEntity Listenerで特定のプロパティが更新されたときにだけ何かしたいという場合は、 PreUpdateEventArgs クラスの hasChangedField($fieldName) メソッドでプロパティが変更されているかどうかを調べればOK
GitHubで編集を提案

Discussion