如何使用 Zend Framework 2轻松列出我们在应用程序中定义的所有路由?
我所说的“路线”是指那些在以下文件中定义的路线:
module/[moduleName]/config/module.config.php
在下面
'router' => array(
'routes' => array(
...
)
)
我需要将它们全部列出,但我无法弄清楚如何轻松地做到这一点,而且文档和论坛现在也没有帮助我。
如何使用 Zend Framework 2轻松列出我们在应用程序中定义的所有路由?
我所说的“路线”是指那些在以下文件中定义的路线:
module/[moduleName]/config/module.config.php
在下面
'router' => array(
'routes' => array(
...
)
)
我需要将它们全部列出,但我无法弄清楚如何轻松地做到这一点,而且文档和论坛现在也没有帮助我。
您可以找到完整的(合并的)配置或转储路由器本身。没有办法导出所有路由对象,所以我要让你失望了。
要获取完整的配置,请从服务定位器中获取:
// $sl instanceof Zend\ServiceManager\ServiceManager
$config = $sl->get('COnfig');
$routes = $config['router']['routes'];
如果您只想出于调试目的查看所有路由,则可以var_dump
在路由器对象上使用或类似:
// $sl instanceof Zend\ServiceManager\ServiceManager
$router = $sl->get('Router');
var_dump($router);
要获取路由实例,您可以使用路由插件管理器自己构建路由,但我不确定这是否是您想要的方式......
要获取所有路线,我使用ZFTool
和控制台命令来获取路由转储:
php vendor/bin/zf.php config list | grep routes
对于 Windows 用户(未测试):
php vendor/bin/zf.php config list | findstr /R /C:"[routes]"
我需要区分每个模块的路由,以便我们可以在不同的情况下分别使用 BjyAuthorize 的 ACL 设置。
虽然有不止一种方法可以做到这一点,例如Jurian Sluiman 展示的读取所有路线(变量已更改):
<?php
// $this->services instanceof Zend\ServiceManager\ServiceManager
$config = $this->services->get('Config');
$routes = $config['router']['routes'];
您可以按如下方式获取它们,以便将来对函数中的每个模块进行区分:
<?php
// $this->services instanceof Zend\ServiceManager\ServiceManager
/**
* Load the Application's active modules.
* @note May need to specify additional modules that may not be
* loaded at this runtime.
*/
$moduleManager = $this->services->get('ModuleManager');
$moduleManager->loadModules();
// Retrieve array of module names.
$modules = $moduleManager->getModules();
// Setup a container for all active routes.
$routes = [];
// Build array of all active routes.
foreach ($modules as $moduleName) {
$module = $moduleManager->getModule($moduleName);
$routes[$moduleName] = array_keys($module->getConfig()['router']['routes']);
}
// Whatever you care to do with them.
echo $routes;
您可以使用以下代码片段从路由器获取路由列表。$mvcEvent
是Zend\Mvc\MvcEvent
和TreeRouteStack
的一个实例Zend\Router\Http\TreeRouteStack
。
$router = $mvcEvent->getRouter();
$routes = (array) $router->getRoutes();
$routes = array_values($routes);
$routes = count($routes) > 0 ? array_keys($routes[0]) : [];