繁体   English   中英

ZF2路由忽略命名空间

[英]ZF2 routing ignores namespace

我遇到zf2路由问题。 我正在使用框架示例https://github.com/zendframework/ZendSkeletonApplication/blob/master/module/Application/config/module.config.php ,但是当我想要访问http://localhost/admin/http://localhost/admin/answers我收到404消息:

A 404 error occurred

Page not found.

The requested controller could not be mapped to an existing controller class.

Controller:
Index(resolves to invalid controller class or alias: Index)
No Exception available

从错误消息我认为路由器忽略__NAMESPACE__。 也许有人可以帮我找到问题的解决方案?

我使用https://github.com/zendframework/ZFTool来创建模块和控制器。 我的文件结构是:

module/Admin
├── config
│   └── module.config.php
├── Module.php
├── src
│   └── Admin
│       └── Controller
│           ├── AnswersController.php
│           └── IndexController.php
└── view
    └── admin
        ├── answers
        │   └── index.phtml
        └── index
            └── index.phtml

我的module.config.php:

return array(
    'controllers'  => array(
        'invokables' => array(
            'Admin\Controller\Answers' => 'Admin\Controller\AnswersController',
            'Admin\Controller\Index'   => 'Admin\Controller\IndexController',
        ),
    ),
    'router'       => array(
        'routes' => array(
            'admin' => array(
                'type'          => 'literal',
                'options'       => array(
                    'route'    => '/admin',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Admin\Controller',
                        'controller'    => 'Index',
                        'action'        => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes'  => array(
                    'default' => array(
                        'type'    => 'segment',
                        'options' => array(
                            'route'       => '/[:controller[/:action]]',
                            'constraints' => array(
                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                            ),
                            'defaults'    => array(
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
    'view_manager' => array(
        'template_path_stack' => array(
            'admin' => __DIR__ . '/../view',
        ),
    ),
);

如果我要改变: '\\__NAMESPACE__' => 'Admin\\Controller', 'controller' => 'Index','controller' => 'Admin\\Controller\\Index'我可以访问索引控制器,但不能访问答案。

附加信息:

我发现了骨架应用程序的奇怪行为。 我已下载了新的骨架应用程序,此配置有效。 如果我要访问localhost/application/indexlocalhost/application/answers它将被视为已接受。 但是,如果我将应用程序模块名称更改为Admin并更改路由器配置(将所有应用程序替换为admin,将Application替换为Admin),则配置将停止工作。 有谁能解释一下? 也许Application模块在骨架应用程序中默认工作?

我正在使用Zend Framework 2.2.4。

添加以上默认密钥

'answers' => array(
  'type' => 'Zend\Mvc\Router\Http\Literal',
  'options' => array(
    'route'    => '/answers',

    'defaults' => array(
      'controller' => 'Admin\Controller\Answers',
      'action'     => 'index',
    ),
  ),
),

如果没有帮助尝试评论默认键所以也许尝试通配符?

'application' => array( 
    'type'    => 'segment', 
    'options' => array( 
        'route'    => '/[:controller][/:action][/:id]', 
        'constraints' => array(
            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*', 
            'id'         => '[0-9]+', 
        ), 
        'defaults' => array( 
            'controller' => 'Application', 
            'action'     => 'index',
        ), 
    ), 
    'may_terminate' => true, 
    'child_routes' => array( 
        'default' => array( 
            'type'    => 'Wildcard', 
            'options' => array( 
            ), 
        ), 
    ), 
), 

它只是导致不完整的解决方案

在Module.php中设置

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
}

我不是100%肯定你想要达到的目标,但这可能会在某种程度上帮助你。 如果你有一个变量控制器参数,我会设置我的路由,如下所示:

'router' => array(
    'routes' => array(
        'admin' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/admin[/:controller[/:action]]',
                'constraints' => array(
                'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
                'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
                ),
                'defaults' => array(
                    'controller' => 'Admin\Controller\Admin',
                    'action'     => 'index',
                    ),
                ),
            ),
        ),
     ),

重定向时,您需要以这种方式指定控制器和操作。

return $this->redirect()->toRoute('admin', array('action' => 'newAction', 'controller' => 'someOtherController'));

URL View-Helper等价物:

$this->url('admin', array('action' => 'newAction', 'controller' => 'someOtherController'));

编辑:

Zend framework2通过您的模型合并所有配置文件,并为路由器模块提供您已配置的阵列。 实际上,您可以扩展Router类并将其更改为您的喜好。

您可能已经看到,在配置文件中为路由器提供每个模块的命名空间实际上并非“强制”。 路由器具有您调用的控制器,可以通过zf2命名约定“跟踪”它们。

编辑2:我忘了添加一些约束到路由你可以再次使用更新的路由配置吗?

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM