Home | Symfony2Doc

このページのコンテンツ

ソース



クイックリンク


コメントリスト

Powered by Disqus

ご質問や翻訳不備等お気軽にコメントください。


コンテンツ上部に更新日の記載のないページは、翻訳の内容が2.0相当のものになっております。最新の内容は原文のページをご確認ください。

Expression

Note

  • 対象バージョン:2.4
  • 翻訳更新日:2013/12/3

New in version 2.4: Expression 制約は Symfony 2.4 から導入されました。

この制約を利用すると、expression コンポーネントの機能を使ったより複雑で動的なバリデーションを行えます。利用例を知りたい方は、基本的な使い方を参照してください。 同じような柔軟性を持つ制約である Callback も合わせてご参照ください。

適用先 class または property/method
オプション
クラス Expression
バリデーター ExpressionValidator

基本的な使い方

BlogPost クラスがあり、category プロパティと isTechnicalPost プロパティを持つとします。

namespace Acme\DemoBundle\Model;

use Symfony\Component\Validator\Constraints as Assert;

class BlogPost
{
    private $category;

    private $isTechnicalPost;

    // ...

    public function getCategory()
    {
        return $this->category;
    }

    public function setIsTechnicalPost($isTechnicalPost)
    {
        $this->isTechnicalPost = $isTechnicalPost;
    }

    // ...
}

このオブジェクトのバリデーションには、次のような特殊な要件があります。

    1. isTechnicalPosttrue の場合、categoryphp または symfony のいずれかのみ
    1. isTechnicalPostfalse の場合、category に制約はない

こういった場合に Expression 制約を使って解決することができます。

  • YAML
    # src/Acme/DemoBundle/Resources/config/validation.yml
    Acme\DemoBundle\Model\BlogPost:
        constraints:
            - Expression:
                expression: "this.getCategory() in ['php', 'symfony'] or !this.isTechnicalPost()"
                message: "技術的な投稿の場合、カテゴリは php  symfony のみ"
    
  • Annotations
    // src/Acme/DemoBundle/Model/BlogPost.php
    namespace Acme\DemoBundle\Model\BlogPost;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    /**
     * @Assert\Expression(
     *     "this.getCategory() in ['php', 'symfony'] or !this.isTechnicalPost()",
     *     message="技術的な投稿の場合、カテゴリは php か symfony のみ"
     * )
     */
    class BlogPost
    {
        // ...
    }
    
  • XML
    <!-- src/Acme/DemoBundle/Resources/config/validation.xml -->
    <class name="Acme\DemoBundle\Model\BlogPost">
        <constraint name="Expression">
            <option name="expression">
                this.getCategory() in ['php', 'symfony'] or !this.isTechnicalPost()
            </option>
            <option name="message">
                技術的な投稿の場合、カテゴリは php か symfony のみ
            </option>
        </constraint>
    </class>
    
  • PHP
    // src/Acme/DemoBundle/Model/BlogPost.php
    namespace Acme\DemoBundle\Model\BlogPost;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class BlogPost
    {
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addConstraint(new Assert\Expression(array(
                'expression' => 'this.getCategory() in ["php", "symfony"] or !this.isTechnicalPost()',
                'message' => '技術的な投稿の場合、カテゴリは php か symfony のみ',
            )));
        }
    
        // ...
    }
    

expression オプションには、バリデーションがパスする場合に true を返す式を指定します。式言語の構文に関する詳細は、式の構文 を参照してください。

式と利用可能な値については、expression オプションの項を参照してください。

利用可能なオプション

expression

タイプ: string [デフォルトオプション]

評価される式を指定します。===== を使った式の評価結果が false だった場合、バリデーションは失敗します。

式言語の構文に関する詳細は、式の構文 を参照してください。

式の中でアクセスできる変数は次の 2 つになっています。

制約に必要な状況に合わせて、式の中で次の変数にアクセスできます。

  • this: バリデーションの対象となっているオブジェクト (e.g. BlogPost のインスタンス);
  • value: バリデーションの対象となっている値 (プロパティに制約が直接適用されている場合にのみ利用可能)

message

タイプ: string デフォルト値: This value is not valid.

式の評価結果が false の場合に、このメッセージが表示されます。

blog comments powered by Disqus