假设我有一个相当标准的路由定义,例如用户资料:
'router' => array(
'routes' => array(
'user' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
'options' => array(
'route' => '/user[/:action]',
'constraints' => array('action' => '[a-zA-Z0-9_-]*'),
'defaults' => array(
'controller' => 'usercontroller',
'action' => 'index',
),
),
),
),
),
现在,假设我想为不同的“用户”操作组使用不同的控制器。比如说一个或两个动作('特殊'和'超',比如说)应该转到'specialcontroller'。我该如何配置?我尝试使用'child_routes'无济于事,我尝试在'routes'数组中有多个'user'条目,但没有快乐。
答案 0 :(得分:3)
您可以使用子路径类型段创建路径类型文字:
'router' => array(
'routes' => array(
'user' => array(
'type' => 'Literal',
'options' => array(
'route' => '/user',
'defaults' => array(
'__NAMESPACE__' => 'MyModule\Controller',
'controller' => 'User',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'default' => 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(
),
),
),
),
),
),
),
或者如果您愿意,直接将控制器名称声明为路由类型段中的路由参数:
'router' => array(
'routes' => array(
'user' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action[/:id]]]',
'defaults' => array(
'__NAMESPACE__' => 'MyModule\Controller',
'controller' => 'User',
'action' => 'index',
),
),
),
),
),
我更喜欢第一种避免模块控制器之间路由冲突的方法
如果您的应用程序的特定部分(此处为:用户)具有多个控制器,并且在同一模块中控制的应用程序的多个部分=>,您也可以执行此操作。在不同的命名空间中组织控制器,如:
namespace MyModule\Controller\Users;
答案 1 :(得分:1)
对于像我这样的人,他们仍在学习ZF2并希望通过NonoHERON更简单的答案,这里是代码:
'user' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/user',
'defaults' => array(
'controller' => 'usercontroller',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'default' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:action]',
'constraints' => array('action' => '[a-zA-Z0-9_-]*'),
'defaults' => array(
'controller' => 'usercontroller',
'action' => 'index',
),
),
),
'special' => array(
'type' => 'Literal',
'options' => array(
'route' => '/details',
'defaults' => array(
'controller' => 'specialcontroller',
'action' => 'special',
),
),
),
),
),
要让“$ this-> url”在您的视图代码中运行,您现在需要稍微设置它。对于默认分组中的操作,它变为:
$this->url('user/default', array('action'=>'whatever'))
虽然对于特殊情况,严格来说应该是:
$this->url('user/special')
但是,如果你所做的只是改变动作所采用的控制器,那么</ p>
$this->url('user/default', array('action'=>'special'))
也应该能够产生正确的链接。
还有一个非常有用的zf2备忘单