Symfony 複数項目に依存したvalidationの作成

  • 1
    Like
  • 0
    Comment

はじめに

自分の備忘録をかねて、symfonyの機能(特にform)関連をまとめています。
今回はcallback validatorを利用して、複数の複数項目に依存した場合のvalidationを作成していきたいと思います。

今まで書いたsymfonyの記事

環境

  • symfony 2.8
  • PHP 7.0

callback制約の作り方

validateメソッド

Callbackのannotionを付与した引数にExecutionContextInterfaceを利用したメソッドを書く、entityに直接書いているので$thisから結びつくentityの値をとることから出来、
引数に受けた$contextにaddViolationすることでvalidationエラーを付与することができる。
buildViolationにメッセージを入力、atPathに表示したいメンバの名前を設定することができる。

    /**
     * @Assert\Callback
     */
    public function validate(ExecutionContextInterface $context)
    {
        if (!empty($this->getMemo()) && !empty($this->getTask())) {
            $context->buildViolation('メモとタスクは両方入力してください。')
                ->atPath('memo')
                ->addViolation();

        }
    }

static method

staticメソッドとして、書くことも出来ます。
その場合は最初の引数でobjectの値を受けます。

    /**
     * @Assert\Callback
     */
    public static function validate($object, ExecutionContextInterface $context)
    {
        if (!empty($object->getMemo()) && !empty($object->getTask())) {
            $context->buildViolation('メモとタスクは両方入力してください。')
                       ->atPath('memo')
                ->addViolation();

        }
    }

External Callbacks and Closures

closureとして書くことも出来ます。

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $callback = function ($object, ExecutionContextInterface $context)
        {
                $context->buildViolation('メモとタスクは両方入力してください。')
                    ->atPath('memo')
                    ->addViolation();


        };
        $metadata->addConstraint(new Assert\Callback($callback));
    }

まとめ

  • symfonyでは複数項目に依存したvalidationもentityに記述することで簡単に記述することが出来ます。validationの処理だけを簡単に切り出すことができるので、決まった書き方をすることでよりすっきり整理して書くことができると思います

参考URL