Laravelで指定のルート名(URL)によって処理を分けたいな….
そのためにルート名を取得するにはどうすればいいんだろう….
こんな疑問解決します。
この記事のゴールは、ルート名によって処理を分けることです。
// 登録処理の場合
if (URLがbook/storeの時) {
登録処理のバリデーション
}
// 更新処理の場合
if (URLがbook/updateの場合) {
更新処理のバリデーション
}
このようにルート名が取得できれば、バリデーションを登録・更新で分けることができます。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
動作環境
Docker 20.10.7
PHP 7.4.22
Laravel 8.53.1
mySQL 5.7
データベースのツール phpmyadmin
Laravelでルート名を取得する方法
ルート名を取得するには、以下でできます。
Request::route()->getName()
そのために、Requestが使えるよう、冒頭に以下のように記述します。
※ルート名を取得し、登録処理と更新処理によってバリデーションの適用を後で分ける実装をするので、フォームリクエストでルート名を取得します。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Request; // ←←←追加
class BookRequest 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()
{
// ルート名の取得
$route_name = Request::route()->getName();
dd($route_name);
}
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Request; // ←←←追加
class BookRequest 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()
{
// ルート名の取得
$route_name = Request::route()->getName();
dd($route_name);
}
dd関数でデバッグし、ルート名が取得できるか確認します。
例えば、登録処理や更新処理のルーティングは以下のように記述しているので、
// 本の登録処理
Route::post('/book/store', [BookController::class, 'store'])->name('book.store');
// 本の更新処理
Route::post('/book/update/{id}', [BookController::class, 'update'])->name('book.update');
登録処理が走ると、book.storeが、更新処理が走ると、book.updateが取得できます。
ルート名によってバリデーションの適用を分ける
ここまででルート名が取得できたので、処理によってバリデーションを分けてみよう。例えば、登録処理ならこのバリデーション、更新処理ならこのバリデーションみたいに。
それでは、ルート名によって、以下のようにバリデーションを分けていきたいと思います。
// 登録処理の場合
if (URLがbook/storeの時) {
登録処理のバリデーション
}
// 更新処理の場合
if (URLがbook/updateの場合) {
更新処理のバリデーション
}
登録処理にだけ、本の名称にバリデーションをかける
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Request; // ←←←追加
class BookRequest 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()
{
// ルート名の取得
$route_name = Request::route()->getName();
$validate = [];
if ($route_name === 'book.store') {
$validate += [
'book_name' => [
'required',
'max:10',
],
];
}
return $validate;
}
更新処理の時は、バリデーションを適用させない
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Request; // ←←←追加
class BookRequest 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()
{
// ルート名の取得
$route_name = Request::route()->getName();
$validate = [];
if ($route_name === 'book.update') {
$validate += [
'book_name' => []
];
}
return $validate;
}
}
全体像は以下になります。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Request; // ←←←追加
class BookRequest 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()
{
// ルート名の取得
$route_name = Request::route()->getName();
$validate = [];
if ($route_name === 'book.store') {
$validate += [
'book_name' => [
'required',
'max:10',
],
];
}
if ($route_name === 'book.update') {
$validate += [
'book_name' => []
];
}
return $validate;
}
}
バリデーションについてまだ不安がある人は、以下の記事がおすすめです。
【まとめ】Laravelでルート名(URL)を取得して処理を分ける方法
今回は、ルート名を取得し、処理によってバリデーションを分ける方法について解説しました。
ピンポイントで処理が実行できれば、開発の領域も広がりますね!
このブログでは、他にも実務で役立つLaravelの記事を書いているのでぜひチェックしてみてください。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
コメント