Laravelでカスタムバリデーションを作成してみます。
サンプルコード
app内にValidatorディレクトリを作成して、その中にCustomValidator.phpを作成します。
app\Validator\CustomValidator.php
今回は郵便番号とパスワードのバリデーションを作成してみます。
作成するclassは\Illuminate\Validation\Validatorを継承する必要があるので注意してください。
<?php
namespace App\Validator;
class CustomValidator extends \Illuminate\Validation\Validator
{
public function validateZipcode($attribute, $value, $parameters)
{
return preg_match('/^\d{3}-\d{4}$/', $value);
}
public function validatePasswordCheck($attribute, $value, $parameters)
{
return preg_match('/^[A-Za-z\d]{8,16}$/', $value);
}
}
メソッド名の頭は「validate」から始まる必要があり、それ以降がバリデーション使用時の名前になります。
上記の場合、validateZipcodeはバリデーション使用時はzipcode、validatePasswordCheckはpassword_checkになります。
app\ProvidersにValidatorServiceProvider.phpを作成します。
app\Providers\ValidatorServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Validator\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()
{
//
}
}
registerメソッドは必ず実装しておく必要があるので注意してください。
app.phpのprovidersに’App\Providers\ValidatorServiceProvider’,を追記します。
PHP
'providers' => [
~ 略 ~
'App\Providers\ValidatorServiceProvider',
],
バリデーションを含めたコントローラーを実装します。
PostController.php
<?php
namespace App\Http\Controllers;
use Request;
use Redirect;
use Validator;
class PostController extends Controller
{
public function getIndex()
{
return view('post.index');
}
// バリデーションのルール
public $validateRules = [
'zip'=>'required|zipcode',
'password'=>'required|password_check'
];
// バリデーションのエラーメッセージ
public $validateMessages = [
'zipcode'=>'郵便番号が正しくありません。',
'password_check'=>'パスワードが正しくありません。'
];
public function postIndex()
{
// postしたデータをすべて取得
$data = Request::all();
//バリデーションをインスタンス化
$val = Validator::make(
$data,
$this->validateRules,
$this->validateMessages
);
//バリデーションNGの場合
if($val->fails()){
return redirect('/post/')->withErrors($val)->withInput();
}
return 'OK!';
}
}
コントローラー内にエラーメッセージを設定していますが、resources\lang\en(ja)\validation.php内に追加してもいいようです。
ビューを作成します。
{!! Form::open() !!}
<dl>
<dt>{!! Form::label('zip', '郵便番号:') !!}<span class="required">(必須)</span></dt>
<dd>
{!! Form::text('zip', null) !!}
@if($errors->has('zip'))<p class="error">{{ $errors->first('zip') }}</p> @endif
</dd>
</dl>
<dl>
<dt>{!! Form::label('password', 'パスワード:') !!}<span class="required">(必須・半角英数8~16文字)</span></dt>
<dd>
{!! Form::text('password', null) !!}
@if($errors->has('password'))<p class="error">{{ $errors->first('password') }}</p> @endif
</dd>
</dl>
<div>
{!! Form::submit('送信') !!}
</div>
{!! Form::close() !!}
入力内容が正しくない場合、設定したエラーが表示されることが確認できました。

【参考サイト】
- laravel5.2 バリデーションを自作 (カスタムバリデーション) – web開発メモ
- Laravel5でカスタムバリデーション – Qiita
- Laravel4, 5 カスタムバリデートの実装 – Qiita
コメントが承認されるまで時間がかかります。