はじめに
登録処理では、バリデーションのrequiredを使いたいけど、更新処理ではrequiredをかけたくない場合があるかと思います。
そんな時に可読性をなるべく落とさずに簡単に条件分岐できる方法を紹介します。
目次
バリデーションをかけるフォーム
例によってショボいフォームを書いてみました。(分かりやすさ重視でシンプルに作ってます)
・更新の際は画像のみバリデーションのrequiredをかけたく無いのを想定しています。
・登録処理では画像は必須にしたいので、リクエストメソッドがpostの時のみrequiredをかけたいところです。
<form
action="{{ route('user.post.update', ['post' => $post]) }}"
enctype="multipart/form-data"
method="POST">
@csrf
@method('PUT')
<div>
<p>タイトル</p>
<input type="text" name="title"
value="{{ old('title', optional($post)->title) }}">
</div>
<div>
<p>投稿内容</p>
<textarea type="text" name="content">
{{old('content', optional($post)->content)}}
</textarea>
</div>
<div>
<p>画像</p>
<input type="file" name="image_url">
</div>
</form>
リクエストファイル
・requiredIfの中がtrueならrequiredを適用となります。
・$request->isMethod('post')
リクエストメソッドがpostであれば、trueを返します。違う場合はfalse。
・$request->isMethod('post')によってpostメソッドの時だけ、'image_url'フィールドがrequiredになります。
// 下記2行を追記
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
// Requestクラスを追記
public function rules(Request $request)
{
return [
'user_id' => [省略],
'title' => [省略],
// Rule::requiredIfメソッドを追記
'image_url' => [Rule::requiredIf($request->isMethod('post'))],
]
}