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}
只有单数形式的时候才行。
其实上面的内容在文档中都有提到,可能大家没有注意到,到真正遇到这个问题的时候才需要。
skylei 2017/08/07 23:48
不错!!