前回軽くふれた内容だけど忘れそう&気になるところがあったので抜粋して少し補足。

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);
    }
}

ルートパラメータから該当するものを取得するのがわかった。