Laravelでカスタムバリデーションを作るのはちょっとめんどい。
いくつかのやり方があるようですが、ここでは、Validatorを継承したクラスを作り、それをサービスプロパイダに登録するやりかたを検証してみます。
###やりたいこ
・なんでもいいので、カスタムバリデーションを作る。
###やりかた
・Illuminate\Validation\Validatorを継承したクラスでルールを定義
・サービスプロバイダを定義
・サービスプロバイダを登録
・カスタムバリデーションを使う
という流れ
###Validatorを継承したクラスにルールを記述
場所はどこでもいいのだけどapp/Servicesに置いているサンプルがあったので、それをまねる。
クラスを定義しない方法もありますが、ここにどんどん増やしていけばいいので、クラスを1つ作っておく方が楽。
<?php namespace App\Services;
class CustomValidator extends \Illuminate\Validation\Validator
{
public function validateFoo($attribute,$value,$parameters){
return $value == "foo";
}
public function validateBoo($attribute,$value,$parameters){
return $value == "boo";
}
}
こんな感じ。実際は正規表現でパターンみたりする。
ここで重要なことは、validateFooやvalidateBooという名前は、使用時には、foo, booとなる。つまり、validateはプリフィックスとなる。また、ルールの頭は小文字となる。なお、validateMyRuleとした場合は、myRuleとなるようだ(なお、カスタムエラーメッセージの定義にはmy_ruleとなるような記述もあるが未確認)。
###サービスプロバイダを定義
ServiceProviderのひな形は、artisan make:providerでつくる。
<?php namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\CustomValidator;
class ValidatorServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
\Validator::resolver(function($translator,$data,$rules,$messages){
return new CustomValidator($translator,$data,$rules,$messages);
});
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
###サービスプロバイダの登録
config/app.phpにプロバイダを登録
'App\Providers\ValidatorServiceProvider',
###カスタムバリデーションを使う
登録が完了すれば、後は普通のルールと同じ。
$input = \Input::all();
$rules = [
'name'=>'required',
'email'=>'required',
'password'=>'boo',
'card'=>'foo',
];
$messages = [
'name.required'=>'name is must.',
'email.required'=>'email is must.',
'password.required'=>'password is must.',
'password.boo'=>'password is boo.',
'card.foo'=>'カードはfooと入れて下さい。',
];
$validation = \Validator::make($input,$rules,$messages);
標準のメッセージはlang/en/validation.phpのcustomをいじればいいらしい(なくても動く)。attribute毎に定義しないといけないのかな?
'custom' => [
'card' => [
'foo' => 'card is must from lang.',
],
],
###メモ
おかしくなったら
php artisan cache:clear
を、実行してみる。SFTPで同期作業していた際に、何度かパーミッションのエラーが出た。その際にcache:clearで治った。