如何自动获取Laravel路由名、控制器方法名及请求方法类型
实现方案
你不需要在每个控制器方法中手动传入参数,既可以直接在方法内调用系统提供的辅助方法自动获取对应值,也可以通过中间件实现全局自动触发事件,完全省略手动写event调用的重复代码。
各目标参数的获取方式
- 路由名(ROUTE_NAME):通过
Route::currentRouteName()直接获取当前路由的命名值 - 控制器方法名(CONTROLLER_METHOD_NAME):通过
Route::current()->getActionMethod()直接获取当前路由匹配的控制器方法名称,无需手动解析路由action配置 - 请求方法类型(CONTROLLER_METHOD_TYPE):通过
request()->method()获取当前请求的HTTP方法,返回值为大写的GET/POST/PUT/DELETE/PATCH等标准方法名 - 控制器名称(CONTROLLER_NAME):你已经在使用的
class_basename(Route::current()->controller)即可正常获取
方案1:控制器内直接调用(保留原有写法,替换参数即可)
如果暂时不想调整现有结构,直接把手动写死的参数替换成自动获取的逻辑即可,示例:
public function destroy(User $user) { event(new AdminActivity( Route::currentRouteName(), class_basename(Route::current()->controller), Route::current()->getActionMethod(), request()->method() )); // 原有业务逻辑 }
方案2:全局中间件自动埋点(推荐,零重复代码)
通过中间件统一处理事件触发,后续新增控制器方法不需要额外写任何日志相关代码,一劳永逸。
- 首先生成中间件文件,执行artisan命令:
php artisan make:middleware LogAdminActivity - 编辑生成的
app/Http/Middleware/LogAdminActivity.php文件,写入以下逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Route; use App\Events\AdminActivity; class LogAdminActivity { public function handle($request, Closure $next) { $response = $next($request); // 过滤闭包路由,只处理控制器路由 if (Route::current()->controller) { event(new AdminActivity( Route::currentRouteName(), class_basename(Route::current()->controller), Route::current()->getActionMethod(), $request->method() )); } return $response; } }
- 打开
app/Http/Kernel.php文件,将该中间件注册到你需要记录后台操作的中间件组中,比如后台admin路由组或者全局web中间件组,注册后所有匹配的请求都会自动触发AdminActivity事件,不需要在控制器内写任何重复代码。
注意:如果需要在控制器方法执行前触发事件,把event调用的逻辑移到
$next($request)之前即可。
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

