国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

這樣修改源碼來獲取當前Webman當前執(zhí)行的路由是否可行?

LEO_D86

這個方法有問題,最新的修改方法在評論中。

沒啥時間通讀代碼了,直接在Webman\app類的findRoute方法中將找到的路由直接賦值到請求對象上,然后可以在其他地方通過請求對象來訪問當前路由。就是不知道有沒有啥副作用,有大佬能看看不?

第一步 修改類Webman\Http\Request,添加一個新的公共屬性currentRoute來存儲在應(yīng)用中找到的路由對象。

第二部 修改類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;
}
1929 3 0
3個回答

walkor 打賞

可行

  • LEO_D86 2022-03-15

    其實不太行,應(yīng)用在找到路由以后會緩存路由信息到 static::$_callbacks 中,所以在第二次訪問的時候會出現(xiàn)問題。目前找到了其他辦法,暫時可以用,我稍后改一下內(nèi)容。

LEO_D86

上面的修改方案有問題,下面是新的修改方式。

修改類\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 = $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, $route]; // 將找到的路由對象緩存起來
        list($callback, $request->app, $request->controller, $request->action, $request->currentRoute) = static::$_callbacks[$key]; // 將路由對象復制到請求對象中
        static::send($connection, $callback($request), $request);

        if (\count(static::$_callbacks) > 1024) {
            static::clearCache();
        }

        return true;
    }
    return false;
}

public function onMessage(TcpConnection $connection, $request)
{
    try {
        static::$_request = $request;
        static::$_connection = $connection;
        $path = $request->path();
        $key = $request->method() . $path;

        if (isset(static::$_callbacks[$key])) {
            list($callback, $request->app, $request->controller, $request->action, $request->currentRoute) = static::$_callbacks[$key]; // 從緩存的數(shù)據(jù)讀取相關(guān)信息并設(shè)置請求對象屬性
            static::send($connection, $callback($request), $request);
            return null;
        }

        if (static::findFile($connection, $path, $key, $request)) {
            return null;
        }

        if (static::findRoute($connection, $path, $key, $request)) {
            return null;
        }

        $controller_and_action = static::parseControllerAction($path);

        if (!$controller_and_action || Route::hasDisableDefaultRoute()) {
            $callback = static::getFallback();
            $request->app = $request->controller = $request->action = '';
            static::send($connection, $callback($request), $request);
            return null;
        }

        $app = $controller_and_action['app'];
        $controller = $controller_and_action['controller'];
        $action = $controller_and_action['action'];
        $callback = static::getCallback($app, [$controller_and_action['instance'], $action]);
        static::$_callbacks[$key] = [$callback, $app, $controller, $action];
        list($callback, $request->app, $request->controller, $request->action) = static::$_callbacks[$key];
        static::send($connection, $callback($request), $request);
    } catch (\Throwable $e) {
        static::send($connection, static::exceptionResponse($e, $request), $request);
    }

    return null;
}

修改類\Webman\Http\Request,添加一個新的公共屬性currentRoute來存儲在應(yīng)用中找到的路由對象,然后就可以使用$request->currentRoute來訪問當前路由。

需要注意的是,webman在判斷路由是否執(zhí)行上面似乎并沒有具體區(qū)分請求方法method,導致使用不同方法訪問一個路由時,依舊會執(zhí)行下去,在某些時候會報錯,不過目前滿足了自己的開發(fā)需要。

  • 暫無評論
walkor 打賞

參照你的方案,已經(jīng)支持通過 $request->route 獲取路由信息,請更新。
composer require workerman/webman-framework ^1.3.2

  • LEO_D86 2022-03-16

    原來支持了啊,感謝!

年代過于久遠,無法發(fā)表回答
??