在 Laravel 中为 GET 和 POST 使用不同的控制器,但使用相同的名称

Posted

技术标签:

【中文标题】在 Laravel 中为 GET 和 POST 使用不同的控制器,但使用相同的名称【英文标题】:Using a different controller for GET and POST in Laravel but using the same name 【发布时间】:2016-01-19 00:05:49 【问题描述】:

我正在为 Web 应用程序编写路由和控制器规则。在多条规则中,出现了一个问题,就是我需要同时匹配 GET 和 POST 动词,并发送给控制器,但是方法不同。

我考虑过为此使用Route::controller('tracking', 'TrackingController'),但它需要为每个内部路由使用不同的名称,而我想为两者指定一个名称。此外,我只看到有关用法的负面信息,这表明这不是一个好主意。

这是我目前拥有的:

Route::match(['get', 'post'], '/tracking', [
    'as' => 'tracking',
    'uses' => 'TrackingController@index'
]);

在实现这一点时,我发现我需要有两个控制器方法,indextrack。如何有效地将GET 路由到indexPOSTtrack,同时保持相同的控制器(TrackingController)和相同的名称(tracking)?

我考虑过使用两条单​​独的路线,例如Route::getRoute::post,但感觉不是很有说服力。

【问题讨论】:

实际上拥有Route::getRoute::post 是非常有说服力的方式,对于维护该应用程序的人来说非常易读且易于理解,因为它是自记录的。如果你真的想做一些事情,你可能会考虑路由分组,但你仍然会得到两条路由,getpost @GladToHelp 路由命名怎么样?当有两条相同的路线时,我应该只命名其中一个吗?毕竟只是为了反向路由。 我认为将它们都命名然后在整个项目中使用路由名称来生成链接总是好的,因为它使您的应用程序易于维护。想象一下,您想稍后更改 uri,如果您只需要在您的 routes.php 中进行更改而不是在整个项目中进行搜索,这将容易得多。 @GladToHelp Righto,我现在已经做到了,它似乎可以按我的意愿工作。我并没有真正认为命名它们会更容易。现在我将 GET tracking 和 POST 命名为 tracking.track,这意味着我可以在以后需要时安全地更改它们。 【参考方案1】:

你可以像这样轻松使用路由控制器

Route::controller('tracking', 'TrackingController')

如果你想在获取和发布时使用相同的方法,只需在方法中使用 any 前缀,比如

//for both get and post
public function anyUrl();
//only get
public function getUrl();
//only post
public function postUrl();

或者使用

Route::any('/url', function () 
return 'Hello World';
);

【讨论】:

以上是关于在 Laravel 中为 GET 和 POST 使用不同的控制器,但使用相同的名称的主要内容,如果未能解决你的问题,请参考以下文章

laravel中如何区分get数据和post数据

为啥 Laravel 默认通过 POST 注销(而不是 GET)? [复制]

Laravel 5 GET 正在工作,但 POST 方法不起作用

在 VueJS 中为 Get、Post、Patch 配置全局标头的最佳方法

laravel中的表单请求类型和CSRF防护

此路由不支持 PUT 方法。支持的方法:GET、HEAD、POST。在 laravel 中