Symfony2のvalidatorコンポーネント(アノテーション編)

ポイントは以下でしょうか。

  • 特にFormと連携しなくても、単独で使えます。
  • Symfony2のサービスコンテナに'validator'サービスとして登録されています。
  • 制約は様々なフォーマットで設定できます。→ YAMLXMLアノテーションPHP
    ただし、アノテーションを使う場合は、app/config/config.ymlに定義する必要があります。(enable_annotations)
  • validatorサービスのvalidateメソッドで検査します。
    結果はエラーメッセージなどを含む配列インタフェースを持つオブジェクトなので、空ならバリデート対象は妥当といえます。
  • 様々な制約が標準で用意されています。もちろん自分で定義することも出来ます。

テストコードを書いて試してみました。

<?php

namespace ...;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Validator\Constraints as Assert;

class SampleData
{
    /**
     * @Assert\NotBlank(message="必須パラメータです")
     * @Assert\Regex(pattern="/^[0-9]{4}$/", message="4桁の数字のみ許容します")
     */
    private $code;

    function __construct($code = '0000')
    {
        $this->code = $code;
    }
}

class ValidatorTest extends WebTestCase
{
    protected $validator;

    public function setUp()
    {
        static::$kernel = static::createKernel();
        static::$kernel->boot();

        $this->validator = static::$kernel->getContainer()->get('validator');
    }

    public function testSuccess()
    {
        $errors = $this->validator->validate(new SampleData());
        $this->assertCount(0, $errors, 'デフォルト値(0000)');

        $errors = $this->validator->validate(new SampleData(1234));
        $this->assertCount(0, $errors, '4桁の数字');

        $errors = $this->validator->validate(new SampleData('0123'));
        $this->assertCount(0, $errors, 'ゼロ埋め');
    }

    public function testFailure()
    {
        $errors = $this->validator->validate(new SampleData(null));
        $this->assertNotCount(0, $errors, 'nullはダメ');

        $errors = $this->validator->validate(new SampleData(''));
        $this->assertNotCount(0, $errors, '空文字はダメ');

        $errors = $this->validator->validate(new SampleData(123));
        $this->assertNotCount(0, $errors, '3桁はダメ');

        $errors = $this->validator->validate(new SampleData(12345));
        $this->assertNotCount(0, $errors, '5桁はダメ');

        $errors = $this->validator->validate(new SampleData('ABCD'));
        $this->assertNotCount(0, $errors, '数字以外はダメ');
    }
}