You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP静态调用路由后如何获取完整的路由对象?

静态调用路由后获取完整Router对象的解决方案

问题背景

我需要通过静态调用方式定义路由:

Route::get('/', 'IndexController::index')->name('index');
Route::get('/news', 'NewsController::News')->name('news');

而非实例化对象的方式。但调用Route::getWholeObject()时,返回的对象路由数组为空,而实例化对象的方式能正常获取包含所有路由的对象。

问题复现

静态调用路由并尝试获取对象:

Route::get('/', 'IndexController::index')->name('index');
Route::get('/news', 'NewsController::News')->name('news');
Route::get('/about', 'AboutController::About')->name('about');

$getTheObject = Route::getWholeObject();

echo'<pre>';
print_r($getTheObject);
echo'</pre>';

返回空路由对象:

Core\Router\Router Object
(
    [routes] => Array
        (
            [names] => Array
                (
                )

            [paths] => Array
                (
                )

            [params] => Array
                (
                )
        )

    [uri] => /rfrfrfr
    [KeepPermamentPath] => 
)

实例化方式则正常输出包含完整路由的对象:

$routes = new Route();
$routes->get('/', 'IndexController::index')->name('index');
$routes->get('/news', 'NewsController::News')->name('news');

echo'<pre>';
print_r($routes);
echo'</pre>';

输出:

Core\Router\Router Object
(
    [routes] => Array
        (
            [names] => Array
                (
                    [index] => Array
                        (
                            [path] => /
                            [call] => IndexController::index
                            [methods] => Array
                                (
                                    [0] => get
                                )

                            [name] => index
                        )

                    [news] => Array
                        (
                            [path] => /news
                            [call] => NewsController::News
                            [methods] => Array
                                (
                                    [0] => get
                                )

                            [name] => news
                        )

                )

            [paths] => Array
                (
                    [/] => Array
                        (
                            [path] => /
                            [call] => IndexController::index
                            [methods] => Array
                                (
                                    [0] => get
                                )

                            [name] => index
                        )

                    [/news] => Array
                        (
                            [path] => /news
                            [call] => NewsController::News
                            [methods] => Array
                                (
                                    [0] => get
                                )

                            [name] => news
                        )

                )

            [params] => Array
                (
                )

        )

    [uri] => /rfrfrfr
    [KeepPermamentPath] => /news
)

问题根源

当前路由类的静态方法每次调用都会创建新的Router实例,静态定义的路由分散在不同实例中;而getWholeObject()方法又会生成全新实例,自然无法获取之前定义的路由。

修复方案

为Router类实现单例模式,让所有静态路由调用复用同一个实例:

  1. 在Router类中添加私有静态属性存储单例:
private static ?self $instance = null;
  1. 新增单例获取方法:
private static function getInstance(): self
{
    if (self::$instance === null) {
        self::$instance = new self();
    }
    return self::$instance;
}
  1. 修改所有HTTP方法的静态实现(以get为例,其他方法如post/put同理):
public static function get(string $path, string $call): self
{
    return self::getInstance()->addRoute('get', $path, $call);
}
  1. 修改getWholeObject()方法返回单例实例:
public static function getWholeObject(): self
{
    return self::getInstance();
}

完成以上修改后,所有静态调用的路由都会被添加到同一个实例中,调用Route::getWholeObject()即可获取包含全部路由信息的完整对象。

内容的提问来源于stack exchange,提问作者WEB TM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:03:25