Laravel4のバリデータ

PHPでの人気のMVCフレームワークのLaravel4。
最近、このLaravel4で仕事をすることが増えてきました。Railsに強く影響を受けたフレームワークの1つではありますが、とにかく書きやすくて、これは人気が出るのも当然だな〜という気がします。
さて、そんなLaravel4について、気づいたことを書いていきたいと思います。


今回は、Laravel4のバリデータについて。


Laravel4のバリデータは、Yiiのバリデータなどと違って、特にモデルにひもづいているわけではありません。
どちらかというと、コントローラ内に記述して入力チェックをすることが多いのではないかと思います。
(もちろん、モデル内に記述してバリデーション処理させることで、Yiiと同様の使い方も出来ます)
参考サイトは
http://laravel4.kore1server.com/docs/validation


それで、基本的な使い方は、ruleを配列で作成して、次のようになります。

$rules = array(
'name' => 'required',
'login' => 'required|alpha_num|unique:users,username'
);
$validator = Validator::make(Input::get(),$rules);
if ($validator->fails()) {
// 失敗処理
return Redirect::back()->withErrors($validator)->withInput();
} else {
// 成功処理
}

Input::get()は、フォームからの入力値です。

この方法だと、view側で(暗黙のflash変数である)$errors変数にエラーが入っているので、$errors->all()ですべてのエラーを取り出すか、
$errors->get('属性')で属性ごとのすべてのエラーを取り出して、表示することが可能です。


ただし、エラー文言は英語になってしまいます。
これを言語ファイルを修正することでも対応は可能ですが、プログラム側で自分でエラー文言を指定したい場合は、次の
ように書き換える必要があります。

$rules = array(
'name' => 'required',
'login' => 'required|alpha_num|unique:users,username'
);
$messages = array(
'required' => ':attributeは必要です。',
'alpha_num' => ':attributeはアルファベットもしくは数字で記述してください。',
'unique' => ':attributeは重複出来ません。'
);
$validator = Validator::make(Input::get(),$rules,$messages);
if ($validator->fails()) {
// 失敗処理
return Redirect::back()->withErrors($validator)->withInput();
} else {
// 成功処理
}

こうすると、文言は日本語になるのですが、属性(attribute)はそのままなので、たとえば「nameは必要です」のようなエラーになってしまいます。

これをさらに、「名前は必要です」というエラーにするためには$validator->setAttributeNames()というメソッドを使って

$rules = array(
'name' => 'required',
'login' => 'required|alpha_num|unique:users,username'
);
$messages = array(
'required' => ':attributeは必要です。',
'alpha_num' => ':attributeはアルファベットもしくは数字で記述してください。',
'unique' => ':attributeは重複出来ません。'
);
$names = array(
'name' => '名前',
'login' => 'ログインアカウント'
);
$validator = Validator::make(Input::get(),$rules,$messages);
$validator->setAttributeNames( $names );
if ($validator->fails()) {
// 失敗処理
return Redirect::back()->withErrors($validator)->withInput();
} else {
// 成功処理
}

のようにすれば、期待通りすべて日本語でのエラー文言になります。


なお、上記の方法以外にも、エラーの全文を$messagesで指定して、たとえば

$messages = array(
'name.required' => '名前が必要です',
...
);

のように記述する方法や、属性(attribute)を言語ファイルのattributes項目に記述するといった方法
http://w.builwing.info/2013/04/12/laravel4%E3%81%A7%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96/
もあります。

ただし、同じ属性名でもモデルごとに違う場合などは、今回紹介した方法を使うのがよいのではないかと思います。
言語化するのであれば、さらに$messagesや$namesを言語ファイルからひっぱってくることも可能です。