Laravel 资源路由可以将典型的「CURD」路由指定到一个控制器上,仅需一行代码就可以实现,是一个非常神奇的工具。但是如果默认的方法不能 100% 的适用于你的需求,你需要覆盖它的话该怎么办呢?我们来看看你可以如何实现。
覆盖路由名称
我们可以通过下面的方法来声明一个资源路由:
Route::resource('article', 'ArticleController');
它会假定控制器包含了下面的方法:index()
create()
store()
edit()
update()
show()
destroy()
并且会为它们设置一个路由名称,如 article.create、article.show 等。
那么,如果你想覆盖它们的话该怎么办呢?资源路由的第三个参数即可实现。
Route::resource('article', 'ArticleController', [
'names' => [
'show' => 'articles.display',
'store' => 'articles.save',
]
]);
此时我们再次查看路由列表,可以看到这两个路由的名称已经被修改:
这时通过 route('article.save') 就能够调用到 ArticleController@store 方法了。
覆盖路由参数
资源控制器会给 show() 或 edit() 方法分配默认的参数。例如 Route::resource('article', 'ArticleController'); 生成的路由看起来是这样的:article/{article}。在控制器中你需要处理 $article 变量。如果出于某种原因,你需要使用 user_article 变量覆盖这个默认变量,你只需这么做:
Route::resource('article', 'ArticleController', [
'parameters' => [
'article' => 'user_article',
]
]);
PS: 这里有个小坑,如果 articles 使用的复数形式,那么这里生成的路由参数将是articles/article,而非 articles/{user_article} 只有单数形式的时候才行。
其实上面的内容在文档中都有提到,可能大家没有注意到,到真正遇到这个问题的时候才需要。