5

如何使用 Zend Framework 2轻松列出我们在应用程序中定义的所有路由?

我所说的“路线”是指那些在以下文件中定义的路线:

module/[moduleName]/config/module.config.php

在下面

'router' => array(
    'routes' => array(
        ...
    )
)

我需要将它们全部列出,但我无法弄清楚如何轻松地做到这一点,而且文档和论坛现在也没有帮助我。

4

4 回答 4

11

您可以找到完整的(合并的)配置或转储路由器本身。没有办法导出所有路由对象,所以我要让你失望了。

要获取完整的配置,请从服务定位器中获取:

// $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);

要获取路由实例,您可以使用路由插件管理器自己构建路由,但我不确定这是否是您想要的方式......

于 2013-08-12T22:39:51.570 回答
2

要获取所有路线,我使用ZFTool

和控制台命令来获取路由转储:

php vendor/bin/zf.php config list | grep routes

对于 Windows 用户(未测试):

php vendor/bin/zf.php config list |  findstr /R /C:"[routes]"
于 2015-03-07T10:48:26.050 回答
0

我需要区分每个模块的路由,以便我们可以在不同的情况下分别使用 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;
于 2015-08-01T00:52:01.477 回答
0

您可以使用以下代码片段从路由器获取路由列表。$mvcEventZend\Mvc\MvcEventTreeRouteStack的一个实例Zend\Router\Http\TreeRouteStack

$router = $mvcEvent->getRouter();
$routes = (array) $router->getRoutes();
$routes = array_values($routes);
$routes = count($routes) > 0 ? array_keys($routes[0]) : [];
于 2019-09-11T21:18:35.203 回答