我将这个作为我的DI配置的一部分,来自骨架应用程序:
'routes' => array(
'default' => array(
'type' => 'Zend\Mvc\Router\Http\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(
'controller' => 'Application\Controller\IndexController',
'action' => 'index',
),
),
),
我想做以下路线:
http://me.com/mycontroller/myaction -->
controller=Applicaiton\Controller\Mycontroller
method=myactionAction
但是,上面的配置会产生:
http://me.com/mycontroller/myaction -->
controller=Mycontroller
method=myactionAction
如您所见,缺少控制器的命名空间。在哪里/如何将命名空间放入? (我知道我可以为每个控制器制作一个DI别名,但这样做会使段匹配失败。)
您不应该在路径中使用分段作为控制器。段匹配可用于操作和其他参数,但不适用于控制器。您可以使用别名来帮助mycontroller匹配MyNamespace \ Mycontroller,但不建议这样做。最好,最简单,性能最好的方法是为每个控制器提供路由,必要时使用段进行操作。
完全有可能实现您最初想要实现的目标。在默认设置中,您可以添加__NAMESPACE__键并略微更改控制器键。
你可以做到这一点:
'default' => array(
'type' => 'Zend\Mvc\Router\Http\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(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Index',
'action' => 'index',
),
),
),
唯一需要进行的其他更改是当您将控制器注册为模块配置中的invokable时,您必须这样做:
'controllers' => array(
'invokables' => array(
'Application\Controller\Index' => 'Application\Controller\IndexController',
),
),
请注意我如何在键中使用Index而不是IndexController。
在我可以找到的文档中的任何地方都没有提到路由的默认定义的__NAMESPACE__键以及在invokables数组行为中键的末尾删除“Controller”。我实际上从ZendSkeletionApplication的路由工作中收集了这些信息: