22
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel5.1でRequestクラスを拡張してValidationするときのカスタムメッセージとかの設定

Posted at

日本語であまり詳しい説明が無かったので、調べたメモ。

Laravel5.1にはRequestクラスを拡張してValidationを行うクラスを作ることができます。
これはControllerが呼ばれる前に実行されるようで、覚えると便利です。

##まずは日本語でも情報が拾えるところから

リクエストクラスの作成

 php artisan make:request CreateHogeRequest

初期はこんなかんじ

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CreateHogeRequest extends Request
{

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false; // ひとまずこれをtrueにすると使える
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
	    // ここにValidationルールを記載
        return [
        ];
    }

}

なので、例えばこんな感じ

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CreateHogeRequest extends Request
{

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; // ひとまずこれをtrueにすると使える
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
	    // ここにValidationルールを記載
        return [
        	'hogeInput' => 'required',
        ];
    }

}

##ここから日本語で情報が少ないもの

###カスタムメッセージを作りたい
そんなときはmessageメソッドを書く

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CreateHogeRequest extends Request
{

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; // ひとまずこれをtrueにすると使える
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
	    // ここにValidationルールを記載
        return [
        	'hogeInput' => 'required',
        ];
    }

    public function messages()
    {
        return [
            'hogeInput.required' => 'ほげ入力は必須項目です。',
        ];
    }

}

###リダイレクト先を前ページではなく違うページにしたい
デフォルトは前ページに戻るようです。
そういうときは$redirectというメンバ変数をオーバーライトする。

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;
use Illuminate\Contracts\Validation\Validator;

class CreateHogeRequest extends Request
{

	 // リダイレクト先
	 protected $redirect = 'hoge/create';
	 
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; // ひとまずこれをtrueにすると使える
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
	    // ここにValidationルールを記載
        return [
        	'hogeInput' => 'required',
        ];
    }

    public function messages()
    {
        return [
            'hogeInput.required' => 'ほげ入力は必須項目です。',
        ];
    }

}

###エラーメッセージのフォーマットを変更したい
これがいちばん苦戦した。

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CreateHogeRequest extends Request
{

	 // リダイレクト先
	 protected $redirect = 'hoge/create';
	 
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; // ひとまずこれをtrueにすると使える
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
	    // ここにValidationルールを記載
        return [
        	'hogeInput' => 'required',
        ];
    }

    public function messages()
    {
        return [
            'hogeInput.required' => 'ほげ入力は必須項目です。',
        ];
    }
    
    /**
     * {@inheritdoc}
     */
    protected function formatErrors(Validator $validator)
    {
        $validator->errors()->add('error_option','hogehoge');
        return $validator->errors()->all();
    }    

}

Illuminate\Contracts\Validation\Validatorを読み込むのだが、
5.0まではIlluminate\Validation\Validatorを読み込むとなっているので、注意が必要。

Declaration of App\Http\Requests\CreateHogeRequest::formatErrors() should be compatible with Illuminate\Foundation\Http\FormRequest::formatErrors(Illuminate\Contracts\Validation\Validator $validator)

古い方のドキュメントに従うとこのようなエラーが出る。

###エラー時にリダイレクトするときにwithでなにか変数を持たせたい
そんなときはresponseメソッドをオーバーライトすればよい。

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CreateHogeRequest extends Request
{

	 // リダイレクト先
	 protected $redirect = 'hoge/create';
	 
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; // ひとまずこれをtrueにすると使える
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
	    // ここにValidationルールを記載
        return [
        	'hogeInput' => 'required',
        ];
    }

    public function messages()
    {
        return [
            'hogeInput.required' => 'ほげ入力は必須項目です。',
        ];
    }
    
    /**
     * {@inheritdoc}
     */
    protected function formatErrors(Validator $validator)
    {
        $validator->errors()->add('error_option','hogehoge');
        return $validator->errors()->all();
    }  
    
    /**
     * リダイレクトの処理をカスタマイズするにはここ
     */
	public function response(array $errors)
    {
        if ($this->ajax() || $this->wantsJson()) {
            return new JsonResponse($errors, 422);
        }
        return $this->redirector->to($this->getRedirectUrl())
                                        ->withInput($this->except($this->dontFlash))
                                        ->withErrors($errors, $this->errorBag)
                                        ->with('hoge_session','session_message');
    }
        

}

sometimesの使い方も知りたかったけど、それはまた今度調べる。

22
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?