我遇到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/index
或localhost/application/answers
,它就会被接受。但是,如果我将应用程序模块名称更改为Admin并更改路由器配置(将所有应用程序替换为admin,将Application替换为Admin),则配置将停止工作。有谁能解释一下?也许Application模块在骨架应用程序中作为默认值使用?
我使用的是Zend Framework 2.2.4。
答案 0 :(得分:1)
添加以上默认密钥
'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(
),
),
),
),
它只是导致不完整的解决方案
答案 1 :(得分:1)
在Module.php中设置
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
}
答案 2 :(得分:0)
我不是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命名约定“跟踪”它们。
EDIT2:我忘了给路线添加一些约束,你可以再次使用更新的路线配置吗?