Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
22
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

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

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の使い方も知りたかったけど、それはまた今度調べる。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
22
Help us understand the problem. What are the problem?