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