请问,如何在中间件中获取完整的控制器名,或者控制器实例?
看文档中请求信息,可以获取完整的url,但是没有找到获取完整的控制器名方法,通过$request->controller()方法获取的不太全,没有命名空间,不能使用反射进行解析,请问有知道如何获取的吗? 准备通过中间件获取完成的控制器名,方法名,然后通过注解(每个方法都通过注解写了当前方法对应的操作),进行操作日志的记录,如果有更好的方法也欢迎指导一下,非常感谢
目前临时的解决方法:
$controller = $request->controller(); if(strpos($controller, '.')){ $controller = str_replace('.', '\', $controller); } $controller = 'app\controller\' . $controller . 'Controller';
完整的好像只有在控制器里面才能获取到,中间件都还没有进行路由调度,估计难····
我们目前有同样的需求,暂时解决办法是通过设置route的prefix在中间件里取得再拼接
route.php
Route::group('v1', function () {
Route::get('action', 'Controller@action');
})
->prefix('\app\controller\v1\\');
middleware.php
<?php
declare(strict_types=1);
namespace app\middleware;
use ReflectionClass;
use app\Request;
class Middleware
{
/**
* 处理请求
*
* @param Request $request
* @param \Closure $next
* @return Response
*/
public function handle(Request $request, \Closure $next)
{
$response = $next($request);
$prefix = $request->rule()->getOption('prefix');
$name = $request->rule()->getName();
list($controllerName, $actionName) = explode('@', $name);
if ($controllerName && $actionName) {
$reflectionClass = new ReflectionClass($prefix . $controllerName);
$action = $reflectionClass->getMethod($actionName);
// do something with refection
}
}
}
为什么不直接在控制器初始化方法或者构造方法里面处理
因为准备通过中间件获取完成的控制器名,方法名,然后通过注解(每个方法都通过注解写了当前方法对应的操作),进行操作日志的记录
$controllerInstance=app()->controller($request->controller()); $reflectionMethod = new ReflectionMethod($controllerInstance, $request->action());
$controllerInstance=app()->controller($request->controller()); $reflectionMethod = new ReflectionMethod($controllerInstance, $request->action());
你这是tp5.1 think6 app 下没有 controller 这个方法