这个方法有问题,最新的修改方法在评论中。
没啥时间通读代码了,直接在Webman\app
类的findRoute
方法中将找到的路由直接赋值到请求对象上,然后可以在其他地方通过请求对象来访问当前路由。就是不知道有没有啥副作用,有大佬能看看不?
第一步 修改类Webman\Http\Request
,添加一个新的公共属性currentRoute
来存储在应用中找到的路由对象。
第二部 修改类Webman\app
// 修改 Webman\app
protected static function findRoute($connection, $path, $key, Request $request)
{
$ret = Route::dispatch($request->method(), $path);
if ($ret[0] === Dispatcher::FOUND) {
$ret[0] = 'route';
$callback = $ret[1]['callback'];
$route = $request->currentRoute = $ret[1]['route']; // 将找到的路由赋值到当前请求对象上
$app = $controller = $action = '';
$args = !empty($ret[2]) ? $ret[2] : null;
if (\is_array($callback) && isset($callback[0]) && $controller = \get_class($callback[0])) {
$app = static::getAppByController($controller);
$action = static::getRealMethod($controller, $callback[1]) ?? '';
}
$callback = static::getCallback($app, $callback, $args, true, $route);
static::$_callbacks[$key] = [$callback, $app, $controller ? $controller : '', $action];
list($callback, $request->app, $request->controller, $request->action) = static::$_callbacks[$key];
static::send($connection, $callback($request), $request);
if (\count(static::$_callbacks) > 1024) {
static::clearCache();
}
return true;
}
return false;
}
可行
其实不太行,应用在找到路由以后会缓存路由信息到 static::$_callbacks 中,所以在第二次访问的时候会出现问题。目前找到了其他办法,暂时可以用,我稍后改一下内容。
上面的修改方案有问题,下面是新的修改方式。
修改类
\Webman\App
,如下修改类
\Webman\Http\Request
,添加一个新的公共属性currentRoute
来存储在应用中找到的路由对象,然后就可以使用$request->currentRoute
来访问当前路由。需要注意的是,webman在判断路由是否执行上面似乎并没有具体区分请求方法
method
,导致使用不同方法访问一个路由时,依旧会执行下去,在某些时候会报错,不过目前满足了自己的开发需要。参照你的方案,已经支持通过 $request->route 获取路由信息,请更新。
composer require workerman/webman-framework ^1.3.2
原来支持了啊,感谢!