Laravel 5.6 附加 Route::resource() 参数

Posted

技术标签:

【中文标题】Laravel 5.6 附加 Route::resource() 参数【英文标题】:Laravel 5.6 additional Route::resource() Parameters 【发布时间】:2018-09-26 18:57:45 【问题描述】:

我想知道如何在不使用查询字符串的情况下向 Laravel 的 Route Resource 添加其他参数。

我创建了一个包含所有内置资源的控制器 (CustomerController),然后添加了以下路由:

Route::resource('customers', 'CustomerController');

我想做的是在不创建自定义路由或使用查询字符串的情况下向一些默认资源添加额外的参数。例如:

带有可选参数(索引)的默认资源:

public function index($page = 0)

    //...

所需网址:

http://www.example.com/customers
http://www.example.com/customers/page

我尝试了以下方法,但出现未找到的异常 (NotFoundHttpException):

Route::resource('customers', 'CustomerController')->parameters([
    'index' => 'page'
]);

这可能吗?如果是这样,我该如何完成?

【问题讨论】:

这与 resources 在 Laravel 中的工作方式背道而驰。您可以排除要覆盖的路由并手动定义它们。请记住,Laravel 是固执己见的,但您可以随时更改它的意见。 【参考方案1】:

资源控制器必须实现一组定义的方法,然后由路由器映射到适当的 HTTP 动词和路径。这些方法、路径和动词构成了无法调整的合约的一部分,否则使用实现资源控制器的 Laravel 应用程序将是一件令人头疼的事情。

资源控制器擅长在所有 Laravel 应用程序中提供相同的体验,如果您的应用程序需要资源控制器不支持开箱即用的行为,那么这表明您不应该使用它们,而应该注册您的手动路由。

如果您只有一个需要实现自定义行为的路由,那么您可以注册 一些 方法而不是所有方法,然后选择将自定义路由注册到您的资源控制器方法,例如:

Route::resource('customers', 'CustomerController')->except([
    'index'
]);

Route::get('/customers/page?', 'CustomerController@index');

Resource Controllers 上的文档涵盖 exceptonly

【讨论】:

嗨@sam,感谢您的详细解释。我正在使用资源,因为除了 Laravel 提供的功能之外,我真的不需要任何额外的功能。在这种情况下,我将使用您的方法。再次感谢:)【参考方案2】:

试试这个:

Route::resource('customers', 'CustomerController')->parameters([
    'customers' => 'page'
]);
The example above generates the following URIs for the resource's show route:

/customers/page

您设置名称路由:'index' 将其替换为变量:'customers' 您的资源名称

【讨论】:

这不一定能回答问题。这只是用参数重命名路由中的路由参数。该问题旨在添加其他参数

以上是关于Laravel 5.6 附加 Route::resource() 参数的主要内容,如果未能解决你的问题,请参考以下文章

将 Laravel 5.5 升级到 5.6 错误

laravel-5.6 中的 MethodNotAllowedHttpException

Laravel 5.6 升级导致日志记录中断

Laravel 安装程序不断安装 5.5 而不是 5.6

如何在 Laravel 框架中降级? (5.6 至 5.5)

laravel 从 5.6 作曲家升级到 5.7 不起作用