ZF3:具有子路由的控制器不起作用
ZF3: Controllers with child routes doesn't work
我是 ZF2 开发人员,正在迁移到 ZF3,我在使用某些控制器时遇到了问题。
例如,我有这个 url:http://localhost/admin which calls to the correct controller (IndexController) and show the correct view. But If I want to associate this url: http://localhos/admin/articulo with ArticuloController doesn't work. When I call to this url: http://localhost/admin/articulo 调用的控制器是 AdminController 并且找不到视图。
选项 1 => module.config.php:
namespace Admin;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;
return [
'router' => [
'routes' => [
'admin' => [
'type' => Segment::class,
'options' => [
'route' => '/admin[/:action]',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
],
'admin/articulos' => [
'type' => Segment::class,
'options' => [
'route' => '/admin/articulos[/:action]',
'defaults' => [
'controller' => Controller\ArticulosController::class,
'action' => 'index',
],
],
],
],
],
'controllers' => [
'factories' => [
Controller\IndexController::class => InvokableFactory::class,
Controller\ArticulosController::class => InvokableFactory::class,
],
],
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout-admin.phtml',
'admin/index/index' => __DIR__ . '/../view/admin/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
],
'template_path_stack' => [
__DIR__ . '/../view',
],
/*
* Con este array de parámetros permitimos enviar datos y no mostrar vista
*/
'strategies' => [
'ViewJsonStrategy',
],
],
];
选项 2 => module.config.php(ZF2 样式):
namespace Admin;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;
return [
'router' => [
'routes' => [
'admin' => [
'type' => Segment::class,
'options' => [
'route' => '/admin[/:action]',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
],
'admin/articulos' => [
'type' => Literal::class,
'options' => [
'route' => '/admin/articulos[/:action]',
'defaults' => [
'controller' => 'Articulos',
'action' => 'index',
],
],
'may_terminate' => true,
'child_routes' => [
'default' =>[
'type' => Segment::class,
'options' => [
'route' => '/[:controller[/:action][/:id1]]',
'constraints' => [
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id1' => '[0-9_-]*'
],
'defaults' => [],
],
],
],
],
],
],
'controllers' => [
'factories' => [
Controller\IndexController::class => InvokableFactory::class,
Controller\ArticulosController::class => InvokableFactory::class,
],
],
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout-admin.phtml',
'admin/index/index' => __DIR__ . '/../view/admin/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
],
'template_path_stack' => [
__DIR__ . '/../view',
],
/*
* Con este array de parámetros permitimos enviar datos y no mostrar vista
*/
'strategies' => [
'ViewJsonStrategy',
],
],
];
选项 3 => module.config.php(遵循 zf3 教程):
https://docs.zendframework.com/zend-mvc/routing/#http-routing-examples
namespace Admin;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;
return [
'router' => [
'routes' => [
'admin' => [
'type' => Segment::class,
'options' => [
'route' => '/admin[/:action]',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
'may_terminate' => true,
'child_routes' => [
'articulos' => [
'type' => Segment::class,
'options' => [
'route' => '/articulos[/:action]',
'defaults' => [
'controller' => Controller\ArticulosController::class,
'action' => 'index'
],
],
],
],
],
],
],
'controllers' => [
'factories' => [
Controller\IndexController::class => InvokableFactory::class,
Controller\ArticulosController::class => InvokableFactory::class,
],
],
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout-admin.phtml',
'admin/index/index' => __DIR__ . '/../view/admin/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
],
'template_path_stack' => [
__DIR__ . '/../view',
],
/*
* Con este array de parámetros permitimos enviar datos y no mostrar vista
*/
'strategies' => [
'ViewJsonStrategy',
],
],
];
对于我调用 url 时的所有配置:http://localhost/admin/articulos 我得到的视图是...
在哪里可以看到调用的控制器是 Admin\Controller\IndexController 而不是 Admin\Controller\ArticulosController
我做错了什么?
更新 1:
选项 3 配置正常!!!我已经从 /cache 目录中删除了所有内容,现在找到了控制器但是......我现在在呈现模板时出错......
留言:
Zend\View\Renderer\PhpRenderer::render: Unable to render template
"admin/articulos/index"; resolver could not resolve to a file
堆栈跟踪:
0 /var/www/html/31juegos/vendor/zendframework/zend-view/src/View.php(207):
Zend\View\Renderer\PhpRenderer->render()
1 /var/www/html/31juegos/vendor/zendframework/zend-view/src/View.php(236):
Zend\View\View->render(Object(Zend\View\Model\ViewModel))
2 /var/www/html/31juegos/vendor/zendframework/zend-view/src/View.php(200):
Zend\View\View->renderChildren(Object(Zend\View\Model\ViewModel))
3 /var/www/html/31juegos/vendor/zendframework/zend-mvc/src/View/Http/DefaultRenderingStrategy.php(105):
Zend\View\View->render(Object(Zend\View\Model\ViewModel))
4 /var/www/html/31juegos/vendor/zendframework/zend-eventmanager/src/EventManager.php(322):
Zend\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Zend\Mvc\MvcEvent))
5 /var/www/html/31juegos/vendor/zendframework/zend-eventmanager/src/EventManager.php(171):
Zend\EventManager\EventManager->triggerListeners(Object(Zend\Mvc\MvcEvent))
6 /var/www/html/31juegos/vendor/zendframework/zend-mvc/src/Application.php(367):
Zend\EventManager\EventManager->triggerEvent(Object(Zend\Mvc\MvcEvent))
7 /var/www/html/31juegos/vendor/zendframework/zend-mvc/src/Application.php(348):
Zend\Mvc\Application->completeRequest(Object(Zend\Mvc\MvcEvent))
8 /var/www/html/31juegos/public/index.php(40): Zend\Mvc\Application->run()
9 {main}
这是一个打字错误的问题。尝试使用此 http://localhost/admin/articulos
(注意结尾 "s"),因为您的路由器是 /admin/articulos
,它指向此 ArticulosController
的 indexAction()
。这就是为什么这个urlhttp://localhost/admin/articulo
(没有结尾"s")无法发送的原因。并且视图结构应该是 module/controller/action
类型。
(代表OP发表).
终于,我解决了我的最后一个问题。问题是由于我的 index.phtml 在错误的目录 /view/admin/articulos/**index/**index.phtml
中。正确的目录是 /view/admin/articulos/index.phtml
.
我是 ZF2 开发人员,正在迁移到 ZF3,我在使用某些控制器时遇到了问题。
例如,我有这个 url:http://localhost/admin which calls to the correct controller (IndexController) and show the correct view. But If I want to associate this url: http://localhos/admin/articulo with ArticuloController doesn't work. When I call to this url: http://localhost/admin/articulo 调用的控制器是 AdminController 并且找不到视图。
选项 1 => module.config.php:
namespace Admin;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;
return [
'router' => [
'routes' => [
'admin' => [
'type' => Segment::class,
'options' => [
'route' => '/admin[/:action]',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
],
'admin/articulos' => [
'type' => Segment::class,
'options' => [
'route' => '/admin/articulos[/:action]',
'defaults' => [
'controller' => Controller\ArticulosController::class,
'action' => 'index',
],
],
],
],
],
'controllers' => [
'factories' => [
Controller\IndexController::class => InvokableFactory::class,
Controller\ArticulosController::class => InvokableFactory::class,
],
],
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout-admin.phtml',
'admin/index/index' => __DIR__ . '/../view/admin/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
],
'template_path_stack' => [
__DIR__ . '/../view',
],
/*
* Con este array de parámetros permitimos enviar datos y no mostrar vista
*/
'strategies' => [
'ViewJsonStrategy',
],
],
];
选项 2 => module.config.php(ZF2 样式):
namespace Admin;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;
return [
'router' => [
'routes' => [
'admin' => [
'type' => Segment::class,
'options' => [
'route' => '/admin[/:action]',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
],
'admin/articulos' => [
'type' => Literal::class,
'options' => [
'route' => '/admin/articulos[/:action]',
'defaults' => [
'controller' => 'Articulos',
'action' => 'index',
],
],
'may_terminate' => true,
'child_routes' => [
'default' =>[
'type' => Segment::class,
'options' => [
'route' => '/[:controller[/:action][/:id1]]',
'constraints' => [
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id1' => '[0-9_-]*'
],
'defaults' => [],
],
],
],
],
],
],
'controllers' => [
'factories' => [
Controller\IndexController::class => InvokableFactory::class,
Controller\ArticulosController::class => InvokableFactory::class,
],
],
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout-admin.phtml',
'admin/index/index' => __DIR__ . '/../view/admin/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
],
'template_path_stack' => [
__DIR__ . '/../view',
],
/*
* Con este array de parámetros permitimos enviar datos y no mostrar vista
*/
'strategies' => [
'ViewJsonStrategy',
],
],
];
选项 3 => module.config.php(遵循 zf3 教程): https://docs.zendframework.com/zend-mvc/routing/#http-routing-examples
namespace Admin;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;
return [
'router' => [
'routes' => [
'admin' => [
'type' => Segment::class,
'options' => [
'route' => '/admin[/:action]',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
'may_terminate' => true,
'child_routes' => [
'articulos' => [
'type' => Segment::class,
'options' => [
'route' => '/articulos[/:action]',
'defaults' => [
'controller' => Controller\ArticulosController::class,
'action' => 'index'
],
],
],
],
],
],
],
'controllers' => [
'factories' => [
Controller\IndexController::class => InvokableFactory::class,
Controller\ArticulosController::class => InvokableFactory::class,
],
],
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout-admin.phtml',
'admin/index/index' => __DIR__ . '/../view/admin/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
],
'template_path_stack' => [
__DIR__ . '/../view',
],
/*
* Con este array de parámetros permitimos enviar datos y no mostrar vista
*/
'strategies' => [
'ViewJsonStrategy',
],
],
];
对于我调用 url 时的所有配置:http://localhost/admin/articulos 我得到的视图是...
在哪里可以看到调用的控制器是 Admin\Controller\IndexController 而不是 Admin\Controller\ArticulosController
我做错了什么?
更新 1:
选项 3 配置正常!!!我已经从 /cache 目录中删除了所有内容,现在找到了控制器但是......我现在在呈现模板时出错......
留言:
Zend\View\Renderer\PhpRenderer::render: Unable to render template "admin/articulos/index"; resolver could not resolve to a file
堆栈跟踪:
0 /var/www/html/31juegos/vendor/zendframework/zend-view/src/View.php(207): Zend\View\Renderer\PhpRenderer->render()
1 /var/www/html/31juegos/vendor/zendframework/zend-view/src/View.php(236): Zend\View\View->render(Object(Zend\View\Model\ViewModel))
2 /var/www/html/31juegos/vendor/zendframework/zend-view/src/View.php(200): Zend\View\View->renderChildren(Object(Zend\View\Model\ViewModel))
3 /var/www/html/31juegos/vendor/zendframework/zend-mvc/src/View/Http/DefaultRenderingStrategy.php(105):
Zend\View\View->render(Object(Zend\View\Model\ViewModel))
4 /var/www/html/31juegos/vendor/zendframework/zend-eventmanager/src/EventManager.php(322): Zend\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Zend\Mvc\MvcEvent))
5 /var/www/html/31juegos/vendor/zendframework/zend-eventmanager/src/EventManager.php(171): Zend\EventManager\EventManager->triggerListeners(Object(Zend\Mvc\MvcEvent))
6 /var/www/html/31juegos/vendor/zendframework/zend-mvc/src/Application.php(367): Zend\EventManager\EventManager->triggerEvent(Object(Zend\Mvc\MvcEvent))
7 /var/www/html/31juegos/vendor/zendframework/zend-mvc/src/Application.php(348): Zend\Mvc\Application->completeRequest(Object(Zend\Mvc\MvcEvent))
8 /var/www/html/31juegos/public/index.php(40): Zend\Mvc\Application->run()
9 {main}
这是一个打字错误的问题。尝试使用此 http://localhost/admin/articulos
(注意结尾 "s"),因为您的路由器是 /admin/articulos
,它指向此 ArticulosController
的 indexAction()
。这就是为什么这个urlhttp://localhost/admin/articulo
(没有结尾"s")无法发送的原因。并且视图结构应该是 module/controller/action
类型。
(代表OP发表).
终于,我解决了我的最后一个问题。问题是由于我的 index.phtml 在错误的目录 /view/admin/articulos/**index/**index.phtml
中。正确的目录是 /view/admin/articulos/index.phtml
.