Laravelのフォームリクエストバリデーションのuniqueで除外IDを指定する
前回軽くふれた内容だけど忘れそう&気になるところがあったので抜粋して少し補足。
Route::resource('sample', 'SampleController');
というルーティングが前提。
バリデーションのuniqueで指定したIDを除外したい場合Rule
クラスのignore
メソッドにIDを指定する。コントローラーにバリデーションを記述するのであれば
// app/Http/Controllers/SampleController.php
public function update(Request $request, $id)
{
$this->validate($request, [
'name' => 'required|max:255',
'email' => [
'required',
'max:255',
'email',
Rule::unique('samples')->ignore($id),
],
]);
// update処理
}
のように$id
を受け取っているのでそれを指定すればいいけど、フォームリクエストに書くときはどうすればいいのか?結論は
// app/Http/Requests/SampleRequest.php
public function rules()
{
return [
'name' => 'required|max:255',
'email' => [
'required',
'max:255',
'email',
Rule::unique('samples')->ignore($this->sample),
],
];
}
だったんだけど$this->sample
というのはなんぞ?と思って調べてみた。
FormRequest
クラスの継承元であるRequest
クラスにあるマジックメソッドにて
// vendor/laravel/framework/src/Illuminate/Http/Request.php
/**
* Get an input element from the request.
*
* @param string $key
* @return mixed
*/
public function __get($key)
{
if ($this->offsetExists($key)) {
return $this->offsetGet($key);
}
return $this->route($key);
}
となっていてinputパラメータに該当するものがあればその値を、なければroute
メソッドにて
// vendor/laravel/framework/src/Illuminate/Http/Request.php
/**
* Get the route handling the request.
*
* @param string|null $param
*
* @return \Illuminate\Routing\Route|object|string
*/
public function route($param = null)
{
$route = call_user_func($this->getRouteResolver());
if (is_null($route) || is_null($param)) {
return $route;
} else {
return $route->parameter($param);
}
}
ルートパラメータから該当するものを取得するのがわかった。