Symfony2のバリデーション - 制約のYAML定義とエラーメッセージの国際化

アノテーションがあまり好きではないので、バリデーションの制約をYAMLに定義することにしました。
ついでにエラーメッセージの国際化(翻訳)も試してみます。

バリデート対象のオブジェクトが以下だとします。

class SampleData
{
    private $code;
    ...
}
Resources/config/validation.yml

validation.yml はSymfony2が自動ロードしてくれる様です。

...\SampleData:
  properties:
    code:
       - NotBlank: { message: "sample_data.code.not_blank" }
       - Regex: { pattern: "/^[0-9]{4}$/", message: "sample_data.code.regex" }
app/config/config.yml

国際化(翻訳)は、水面下でTranslationコンポーネントが面倒みてくれます。

framework:
    translator: { fallback: "%locale%" }    # translator: { fallback: ja }
Resources/translations/validators.*.yml

バリデータ用のメッセージ定義は、Resources/translations/messages.*.yml ではなく、validators.*.yml になります。
(日本語メッセージはvalidators.ja.yml、英語メッセージはvalidators.en.yml)

sample_data.code.not_blank: 必須パラメータです
sample_data.code.regex: 4桁の数字のみ許容します

こんな書き方も出来ます。

sample_data:
  code:
    not_blank: 必須パラメータです
    regex: 4桁の数字のみ許容します

validatorのvalidateメソッドが返す結果オブジェクトに、エラーメッセージがセットされています。

$errors = $this->validator->validate(new SampleData('Invalid'));
foreach ($errors as $error) {
    print $error->getPropertyPath() . " - " . $error->getMessageTemplate() . " : " . $error->getMessage() . "\n";
}

↓

code - sample_data.code.regex : 4桁の数字のみ許容します

※うまく反映されない場合は、キャッシュクリアをお試しください。