【Laravel】prefixのついたルートに名前付きルートでアクセスする

Task

2019年09月23日 18:15

Laravel ではコントローラーを生成する際に resources と指定することで簡単に CRUD の機能をもたせることが可能で、自動的にルートに対して名前を付与してくれます。

例えば UserController が resources で登録されているとき、php artisan route:listを確認すると以下のようになっています(一部省略)。

Domain Method URI Name POST users users.store GET | HEAD users users.index GET | HEAD users/create users.create GET |HEAD users/{user} users.show PUT | PATCH users/{user} users.update DELETE users/{user} users.destroy GET | HEAD users/{user}/edit users.edit

Laravel で Future テストを行う際には直接 URI を指定することも可能ですが、name がついている場合 name で指定することも可能です。

// uri指定
$response = $this->post('users/store'), $data);

// name指定
$response = $this->post(route('users.store'), $data);

今回管理者がユーザのデータを編集できることをテストするために、admin という prefix のついた UserController の Name を指定していたのですが、データベースに登録する部分でエラーが出てしまいました。

Route::group(['prefix' => 'admin'], function () {
    Route::resource('users', 'UserController');
});

方法を変えて URI の指定(admin/users)も試しましたが、こちらはルート定義がなされてないといういうエラー。どうしようかと調べていたところ、prefix をつけただけでは Name には反映されないようです。

Laravel 5.3   resource での名前付き route の変更 – ララジャパン

URI だけではなく Name にも反映させるにはグループ化で'as' => '{prefix}.'と指定することが必要でした。

Route::group(['prefix' => 'admin', 'as' => 'admin.'], function () {
    Route::resource('users', 'UserController');
});

これで prefix のグループ化を行ったルートにも Name 指定でアクセスすることができるようになります。

p { margin-bottom: 1em; } blockquote p { margin-bottom: initial; } #content ul { padding-left: 40px; } .token.operator { background-color: initial; }

関連記事