【问题标题】:ZF3: Controllers with child routes doesn't workZF3:带有子路由的控制器不起作用
【发布时间】:2017-10-01 12:05:02
【问题描述】:

我是 ZF2 开发人员,我正在迁移到 ZF3,但在使用某些控制器时遇到了问题。

例如,我有这个 url:http://localhost/admin,它调用正确的控制器 (IndexController) 并显示正确的视图。但是如果我想将这个 url:http://localhos/admin/articulo 与 ArticuloController 关联起来是行不通的。当我调用这个 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: 无法渲染模板 “管理员/文章/索引”;解析器无法解析到文件

堆栈跟踪:

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->渲染(对象(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->渲染(对象(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(对象(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 {主要}

【问题讨论】:

  • 我建议将其关闭为此问题是由无法再复制的问题或简单的印刷错误引起的。

标签: php model-view-controller configuration zend-framework3


【解决方案1】:

这是一个错字问题。试试这个http://localhost/admin/articulos(注意结尾"s"),因为你的路由器是/admin/articulos,它指向这个ArticulosController的indexAction()。这就是为什么这个 url http://localhost/admin/articulo(不以 "s" 结尾)无法发送的原因。并且视图结构应该是module/controller/action 类型。

【讨论】:

  • 感谢您的帮助!!!但是localhost/admin/articulos 不起作用:(
  • 是的。我在最初的帖子中添加了更多信息
  • 根据您的 OPTION 1 和 OPTION 3 的配置,admin/articulos 和 admin/index/articulos 路由在这里分别可以正常工作。
  • 请将视图模板固定为admin/articulos/index.phtml 而不是admin/articulos/index/index.phtml
  • 是的!!!!我现在看到并修复它!非常感谢您的赞赏帮助!!!你救了我的命!!!
【解决方案2】:

(代表 OP 发布)。

最后,我解决了我的最后一个问题。问题是由于我的 index.phtml 位于错误的目录/view/admin/articulos/**index/**index.phtml 中。正确的目录是/view/admin/articulos/index.phtml。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2016-12-14
    • 1970-01-01
    • 2015-10-17
    • 2018-02-21
    相关资源
    最近更新 更多