はい、今回はgetで取得したパラメーターをFormRequestクラスを使ってバリデーションをかける方法を共有します。
基本的なFormRequestを利用したバリデーションは以下を確認ください。
結構調べてもよくわからんかったんですが、stack overflowで回答されている方がいたのでそちらの記事と、
Laravelの公式の情報を確認しながら紹介していきます。
簡単に概要だけ説明すると、以下のようなURLから取得したパラメータ(id)がバリデーションできないのです。
Route::get('hoge/{id}', [testController::class, '対象コントローラーのメソッド名']);
Code language: PHP (php)
Table of Contents
伝えたいこと
今回はタイトルそのままで、getで取得したパラメーターをどうやってバリデーションかけていくのかを紹介します。
なので、今回の目的はgetで取得したパラメータをFormRequestでバリデーションできる!
というのが目標です。
バリデーションはセキュリティ対策をするにはとても必要なことなのでしっかり対策しておきましょう。
課題と原因
通常POSTで受け取った値はrequestとして処理されて、FormRequestでバリデーションができるんですよね。
何ですが、GETで取得した値っていうのはFormRequestには無視されているようです。(多分….requestじゃないからかな?)
なので、普通に適当な値を送っても通っちゃいます。
これはまずいなってことで、FormRequestでバリデーション処理できるようにしていきます。
解決方法: merge()を使う
specified_dateという変数の中にルーティングから取得してきたidをmergeします。
formrequest.php
protected function prepareForValidation()
{
$this->merge(['id' => $this->route('id')]);
}
Code language: PHP (php)
mergeメソッドの利用方法は以下の通りです。
merge()
https://readouble.com/laravel/8.x/ja/collections.html#method-merge
merge
メソッドは、指定した配列かコレクションをオリジナルコレクションへマージします。指定した配列の文字列キーが、オリジナルコレクションの文字列キーと一致する場合、オリジナルコレクションの値は指定アイテムの値でオーバーライトされます。
そしたら先ほど、protected function prepareForValidation()
を作成したので、いつも通りruleを書いていきましょう。
app/Http/Requests/△△△Request.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class hogeRequest extends FormRequest
{
/**
* 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()
{
return [
'id' => ['required'],
];
}
/**
* バリーデーションのためにデータを準備
* @return void
*/
//GETパラメータをバリデーションするために追加する。
protected function prepareForValidation()
{
//getで取得したパラメータをmergeする。
$this->merge(['id' => $this->route('id')]);
}
}
Code language: HTML, XML (xml)
ほい、こんな感じで、GETで取得したパラメータをバリデーションすることができましたね。
まとめ
今回はidでバリデーションしてみましたが、他のGETメソッドの際にでも利用できるかなって思います!