ZF2 控制台:在 Zend\Navigation\Page 中找不到名称为 "xy" 的路由
ZF2 Console: Route with name "xy" not found in Zend\Navigation\Page
我编写了一个模块来生成站点地图 xml 文件。我想通过 cronjob 在控制台路由中生成它们,但问题是当我遍历导航容器时出现异常 Route with name "xy" not found
。该路线肯定存在。如果我在网络请求中调用它,一切正常。堆栈跟踪如下所示:
======================================================================
The application has thrown an exception!
======================================================================
Zend\Mvc\Router\Exception\RuntimeException
Route with name "home" not found
----------------------------------------------------------------------
vendor/zendframework/zend-mvc/src/Router/SimpleRouteStack.php:328
#0 vendor/zendframework/zend-navigation/src/Page/Mvc.php(260): Zend\Mvc\Router\SimpleRouteStack->assemble(Array, Array)
#1 vendor/zendframework/zend-navigation/src/Page/AbstractPage.php(999): Zend\Navigation\Page\Mvc->getHref()
#2 vendor/zendframework/zend-navigation/src/Page/AbstractPage.php(1035): Zend\Navigation\Page\AbstractPage->get('href')
#3 module/Sitemap/src/Sitemap/Service/GeneratorService.php(83): Zend\Navigation\Page\AbstractPage->__get('href')
#4 module/Sitemap/src/Sitemap/Controller/Cli/GeneratorController.php(31): Sitemap\Service\GeneratorService->generateSitemaps()
#5 vendor/zendframework/zend-mvc/src/Controller/AbstractActionController.php(82): Sitemap\Controller\Cli\GeneratorController->indexAction()
#6 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent))
#7 vendor/zendframework/zend-eventmanager/src/EventManager.php(490): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#8 vendor/zendframework/zend-eventmanager/src/EventManager.php(214): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#9 vendor/zendframework/zend-mvc/src/Controller/AbstractController.php(118): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#10 vendor/zendframework/zend-mvc/src/DispatchListener.php(93): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Console\Request), Object(Zend\Console\Response))
#11 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
#12 vendor/zendframework/zend-eventmanager/src/EventManager.php(490): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#13 vendor/zendframework/zend-eventmanager/src/EventManager.php(214): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#14 vendor/zendframework/zend-mvc/src/Application.php(314): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#15 public/index.php(15): Zend\Mvc\Application->run()
#16 {main}
======================================================================
您正在使用 CLI 处理或生成您的站点地图 XML,因此使用另一个路由器,即 CLI 路由器。
因此您需要获取另一个路由器 class -> HTTP 路由器。
array(
// HttpRouter
'router' => array(
'routes' => array(
// HTTP routes are here
)
),
// Console Router
'console' => array(
'router' => array(
'routes' => array(
// Console routes go here
)
)
),
)
所以为了得到 HttpRouter:
$serviceManager->get('HttpRouter')
因此,如果您想使用 HttpRouter,您可以在 CLI 控制器中执行以下操作:
$cliRouter = $this->getEvent()->getRouter();
$this->getEvent()->setRouter($httpRouter);
// Http Routers can be called with the plugins
$this->url()->fromRoute('home');
// Use CLI router again
$this->getEvent()->setRouter($cliRouter);
调用 $this->url()->fromRoute('home');
这会在使用 CLI 路由器时在您的问题中抛出错误。 "home" 未在您的控制台路由中定义,因此无法找到。将您的路由器更改为您在 HTTP 路由中定义的 Http。
我编写了一个模块来生成站点地图 xml 文件。我想通过 cronjob 在控制台路由中生成它们,但问题是当我遍历导航容器时出现异常 Route with name "xy" not found
。该路线肯定存在。如果我在网络请求中调用它,一切正常。堆栈跟踪如下所示:
======================================================================
The application has thrown an exception!
======================================================================
Zend\Mvc\Router\Exception\RuntimeException
Route with name "home" not found
----------------------------------------------------------------------
vendor/zendframework/zend-mvc/src/Router/SimpleRouteStack.php:328
#0 vendor/zendframework/zend-navigation/src/Page/Mvc.php(260): Zend\Mvc\Router\SimpleRouteStack->assemble(Array, Array)
#1 vendor/zendframework/zend-navigation/src/Page/AbstractPage.php(999): Zend\Navigation\Page\Mvc->getHref()
#2 vendor/zendframework/zend-navigation/src/Page/AbstractPage.php(1035): Zend\Navigation\Page\AbstractPage->get('href')
#3 module/Sitemap/src/Sitemap/Service/GeneratorService.php(83): Zend\Navigation\Page\AbstractPage->__get('href')
#4 module/Sitemap/src/Sitemap/Controller/Cli/GeneratorController.php(31): Sitemap\Service\GeneratorService->generateSitemaps()
#5 vendor/zendframework/zend-mvc/src/Controller/AbstractActionController.php(82): Sitemap\Controller\Cli\GeneratorController->indexAction()
#6 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent))
#7 vendor/zendframework/zend-eventmanager/src/EventManager.php(490): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#8 vendor/zendframework/zend-eventmanager/src/EventManager.php(214): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#9 vendor/zendframework/zend-mvc/src/Controller/AbstractController.php(118): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#10 vendor/zendframework/zend-mvc/src/DispatchListener.php(93): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Console\Request), Object(Zend\Console\Response))
#11 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
#12 vendor/zendframework/zend-eventmanager/src/EventManager.php(490): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#13 vendor/zendframework/zend-eventmanager/src/EventManager.php(214): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#14 vendor/zendframework/zend-mvc/src/Application.php(314): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#15 public/index.php(15): Zend\Mvc\Application->run()
#16 {main}
======================================================================
您正在使用 CLI 处理或生成您的站点地图 XML,因此使用另一个路由器,即 CLI 路由器。
因此您需要获取另一个路由器 class -> HTTP 路由器。
array(
// HttpRouter
'router' => array(
'routes' => array(
// HTTP routes are here
)
),
// Console Router
'console' => array(
'router' => array(
'routes' => array(
// Console routes go here
)
)
),
)
所以为了得到 HttpRouter:
$serviceManager->get('HttpRouter')
因此,如果您想使用 HttpRouter,您可以在 CLI 控制器中执行以下操作:
$cliRouter = $this->getEvent()->getRouter();
$this->getEvent()->setRouter($httpRouter);
// Http Routers can be called with the plugins
$this->url()->fromRoute('home');
// Use CLI router again
$this->getEvent()->setRouter($cliRouter);
调用 $this->url()->fromRoute('home');
这会在使用 CLI 路由器时在您的问题中抛出错误。 "home" 未在您的控制台路由中定义,因此无法找到。将您的路由器更改为您在 HTTP 路由中定义的 Http。