如何在Laravel 5.1中让指定路由响应所有HTTP请求方法?
在Laravel 5.1中让路由响应所有HTTP方法并统一处理
嘿,刚好我对Laravel 5.1的路由机制挺熟的,给你两种简单的实现方式,完美解决你不想写一堆get/post/delete方法的问题:
方法一:直接使用Route::any(最推荐)
这是最直观也最省心的方式,直接指定某个路由匹配所有HTTP请求方法,然后绑定到控制器的单个方法上:
路由定义(routes.php中)
// 匹配所有HTTP方法的请求到FooController的index方法 Route::any('foo', 'FooController@index'); // 如果需要匹配foo下的子路由(比如foo/bar),可以这么写 Route::any('foo/{action?}', 'FooController@handleAll');
控制器代码
class FooController extends Controller { // 处理所有针对foo路由的请求 public function index() { // 可以通过request对象获取当前请求的方法 $currentMethod = request()->method(); // 后续统一逻辑写在这里就行,不管是GET/POST/DELETE都走这里 } // 处理带参数的子路由请求 public function handleAll($action = null) { $currentMethod = request()->method(); // 根据action和请求方法灵活处理逻辑 } }
方法二:适配你想要的allIndex风格(自定义隐式控制器逻辑)
如果你还是想沿用类似Route::controller的隐式路由风格,希望用allXXX格式的方法统一处理所有请求,可以通过扩展路由逻辑实现:
步骤1:自定义路由宏(封装复用)
在AppServiceProvider的boot方法里添加自定义路由逻辑:
use Illuminate\Routing\Router; public function boot(Router $router) { $router->macro('anyController', function($uri, $controller) { // 绑定所有HTTP请求到控制器的allIndex方法 $router->any($uri, $controller.'@allIndex'); // 如果需要处理更多子路由规则,可以在这里扩展,比如匹配foo/bar到allBar方法 }); }
步骤2:使用自定义路由宏
// 在routes.php中调用自定义宏 Route::anyController('foo', 'FooController');
步骤3:控制器实现allIndex方法
class FooController extends Controller { public function allIndex() { $currentMethod = request()->method(); // 统一处理所有请求方法的逻辑 } }
不过说实话,第一种方法Route::any已经足够满足需求,代码更清晰、维护成本更低,没必要搞复杂的隐式控制器扩展~
另外,如果你需要在统一方法里区分请求类型,用request()->method()就能拿到当前请求的具体方法(比如GET、POST这类大写字符串),方便做细微的逻辑区分。
内容的提问来源于stack exchange,提问作者Greendrake
相关产品推荐
相关产品推荐

