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
コメントが承認されるまで時間がかかります。