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

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

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

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

リクエストクラスの作成

 	 php artisan make:request CreateHogeRequest
 
 
初期はこんなかんじ
 
```php:
<?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:
<?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:
<?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:
<?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:
<?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:
<?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の使い方も知りたかったけど、それはまた今度調べる。