Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@yutachaos

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

More than 3 years have passed since last update.

はじめに

自分の備忘録をかねて、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

4
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
yutachaos
Programmer,Bassist,Bibliomania
recruitmp
結婚・カーライフ・進学の情報サイトや『スタディサプリ』などの学びを支援するサービスなど、ライフイベント領域に関わるサービスを提供するリクルートグループの中核企業

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?