はじめに
自分の備忘録をかねて、symfonyの機能(特にform)関連をまとめています。
今回はcallback validatorを利用して、複数の複数項目に依存した場合のvalidationを作成していきたいと思います。
今まで書いたsymfonyの記事
- symfony でのform作成の基本
- symfony 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の処理だけを簡単に切り出すことができるので、決まった書き方をすることでよりすっきり整理して書くことができると思います