Laravelでカスタムバリデーションを作成する

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() !!}

入力内容が正しくない場合、設定したエラーが表示されることが確認できました。

to-create-a-custom-validation-in-laravel01

 

【参考サイト】

 

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2024年4月
 123456
78910111213
14151617181920
21222324252627
282930