デフォルトのバリデータでは処理できない複雑なバリデートを行う場合、以下の方法でカスタムバリデータを作成し、適用することが可能。
以下、WEBで見つけた文献。実際に使えることも確認済み。
それぞれのバリデータはsfValidatorクラスを拡張するクラスです。symfonyに搭載されたバリデータクラスがあなたのニーズに適していない場合、オートロードすることができるlib/ディレクトリのどこにでも新しいものを簡単に作成することが出来ます。シンタックスはとてもシンプルです。
バリデータが実行される時、バリデータのexecute()メソッドが呼び出されます。initialize()メソッドでのデフォルトセッティングを定義することもできます。
execute()メソッドは最初のパラメータとしてバリデートする値と第2のパラメータとしてスローするエラーメッセージを取得します。両方はリファレンスとして渡されるので、メソッドの範囲以内からエラーメッセージを修正することができます。
initialize()メソッドはYAMLファイルからコンテクストシングルトンとパラメータの配列を取得します。最初に親のsfValidatorクラスのinitalize()メソッドを呼ばなければならず、そしてデフォルトの値をセットします。
すべてのバリデータは$this->getParameterHolder()によってアクセス可能なパラメータホルダを持ちます。
例えば、sfSpamValidatorをビルドしたい場合、リスト10-31で示されるコードをsfSpamValidator.class.phpファイルを追加して下さい。$valueがmax_url倍の文字列'http'以上を含むのかをチェックします。
リスト 10-31 - lib/sfSpamValidator.class.phpにカスタムバリデータを作成する
class sfSpamValidator extends sfValidator
{
public function execute (&$value, &$error)
{
// For max_url=2, the regexp is /http.*http/is
$re = '/'.implode('.*', array_fill(0, $this->getParameter('max_url') + 1, 'http')).'/is';
if (preg_match($re, $value))
{
$error = $this->getParameter('spam_error');
return false;
}
return true;
}
public function initialize ($context, $parameters = null)
{
// Initialize parent
parent::initialize($context);
// Set default parameters value
$this->setParameter('max_url', 2);
$this->setParameter('spam_error', 'This is spam');
// Set parameters
$this->getParameterHolder()->add($parameters);
return true;
}
}
バリデータがautoloadableディレクトリに追加される(とキャッシュがクリアされる)と同時に、リスト10-32で示されるように、バリデーションファイルでそれを使用することが出来ます。
リスト 10-32 - validate/send.ymlにあるカスタムバリデータを使用する
fields:
message:
required:
msg: The message field cannot be left blank
sfSpamValidator:
max_url: 3
spam_error: Leave this site immediately, you filthy spammer!

