首页 » Web技术 » Laravel » 正文

资源控制器:覆盖默认的路由名称和参数

Laravel 资源路由可以将典型的「CURD」路由指定到一个控制器上,仅需一行代码就可以实现,是一个非常神奇的工具。但是如果默认的方法不能 100% 的适用于你的需求,你需要覆盖它的话该怎么办呢?我们来看看你可以如何实现。

覆盖路由名称

我们可以通过下面的方法来声明一个资源路由:

Route::resource('article', 'ArticleController');

它会假定控制器包含了下面的方法:

  • index()
  • create()
  • store()
  • edit()
  • update()
  • show()
  • destroy()

并且会为它们设置一个路由名称,如 article.createarticle.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} 只有单数形式的时候才行。

其实上面的内容在文档中都有提到,可能大家没有注意到,到真正遇到这个问题的时候才需要。

本文共 1 个回复

  • skylei 2017/08/07 23:48

    :razz: 不错!!

发表评论