Laravel バリデーション FormRequest
FormRequest
フォームリクエストを使用するとリクエスト作成時にバリデーション処理を挟むことができる。
コントローラでの記述を無くし、ファットコントローラを防ぐ→リファクタリング
root@6381a967eccb:/var/www/html# php artisan make:request UploadImageRequest Request created successfully.
App\Http\Requests\UploadImageRequest.php
が生成
- メソッドが2つ定義されている
authorize
:認証されてるユーザーが使えるかどうか→trueにする。
rules
:バリデーションルール(連想配列)を書く。
message
メソッドでバリデーションメッセージの設定。
フォームリクエストを定義していない場合はエラーメッセージは
resources/lang/ja/validation.php
に記述されている。
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UploadImageRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'image' => 'image|mimes:jpg,jpeg,png|max:2048', ]; } public function messages() { return [ 'image' => '指定されたファイルが画像ではありません。', 'mines' => '指定された拡張子(jpg/jpeg/png)ではありません。', 'max' => 'ファイルサイズは2MB以内にしてください。', ]; } }
Controller
use文を定義し、引数にUploadImageRequestをいれて使う。
<?php use App\Http\Requests\UploadImageRequest; public function edit( UploadImageRequest $request, $id) { if($request->isMethod('get')){ $this->viewData['shop'] = Shop::findOrFail($id); return view('owner.shops.edit', $this->viewData); } if($request->isMethod('post')){ //$request->imageでname属性を取得することで画像を取得できる $imageFile = $request->image; //画像がnullでなかったら && isValidでアップロードできたか判定 if(!is_null($imageFile) && $imageFile->isValid()){ $fileNameToStore = ImageService::addByImage($imageFile, 'shops'); } } return redirect()->route('owner.shops.index'); }
view側の追記
view側ではデフォルトでコンポーネントとしてエラーメッセージがある。
{{-- validationエラーメッセージ --}} <x-auth-validation-errors class="mb-4" :errors="$errors" />
<?php @props(['errors']) @if ($errors->any()) <div {{ $attributes }}> <div class="font-medium text-red-600"> {{ __('Whoops! Something went wrong.') }} </div> <ul class="mt-3 list-disc list-inside text-sm text-red-600"> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif