1. kumechang

    Posted

    kumechang
Changes in title
+Laravel5.1でRequestクラスを拡張してValidationするときのカスタムメッセージとかの設定
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,333 @@
+日本語であまり詳しい説明が無かったので、調べたメモ。
+
+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の使い方も知りたかったけど、それはまた今度調べる。