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类实现单例模式,让所有静态路由调用复用同一个实例:
- 在
Router类中添加私有静态属性存储单例:
private static ?self $instance = null;
- 新增单例获取方法:
private static function getInstance(): self { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; }
- 修改所有HTTP方法的静态实现(以
get为例,其他方法如post/put同理):
public static function get(string $path, string $call): self { return self::getInstance()->addRoute('get', $path, $call); }
- 修改
getWholeObject()方法返回单例实例:
public static function getWholeObject(): self { return self::getInstance(); }
完成以上修改后,所有静态调用的路由都会被添加到同一个实例中,调用Route::getWholeObject()即可获取包含全部路由信息的完整对象。
内容的提问来源于stack exchange,提问作者WEB TM
相关产品推荐
相关产品推荐

