我是ZF2开发人员,我正在迁移到ZF3,而且我遇到了一些控制器的麻烦 .
例如,我有这个url:http://localhost/admin调用正确的控制器(IndexController)并显示正确的视图 . 但是,如果我想关联此URL:http://localhos/admin/articulo与ArticuloController不起作用 . 当我调用这个url:http://localhost/admin/articulo时,调用的控制器是AdminController并且找不到视图 .
OPTION 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',
],
],
];
OPTION 2 => module.config.php (ZF2 style):
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',
],
],
];
OPTION 3 => module.config.php (following zf3 tutorial): 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目录中的所有内容,现在找到了控制器但是...我现在收到了渲染模板的错误...
Message:
Zend \ View \ Renderer \ PhpRenderer :: render:无法渲染模板“admin / articulos / index”;解析器无法解析为文件
Stack Trace:
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(对象(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(对象(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 \ EventManag er-> triggerEvent(Object(Zend \ Mvc \ MvcEvent))7 /var/www/html/31juegos/vendor/zendframework/zend-mvc/src/Application.php(348):Zend \ Mvc \ Application-> completeRequest(对象(Zend \ Mvc \ MvcEvent))8 /var/www/html/31juegos/public/index.php(40):Zend \ Mvc \ Application-> run()9
2 回答
(代表OP发布) .
最后,我修复了我的最后一个问题 . 问题是由于我的index.phtml位于错误的目录
/view/admin/articulos/**index/**index.phtml
. 正确的目录是/view/admin/articulos/index.phtml
.这是一个 typo 问题 . 试试这个
http://localhost/admin/articulos
(注意结尾 "s" )因为你的路由器是/admin/articulos
,它指的是ArticulosController
的indexAction()
. 这就是为什么这个网址http://localhost/admin/articulo
(没有结束 "s" )无法发送 . 视图结构应为module/controller/action
类型 .