一条路线上有多个控制器

时间:2014-01-19 20:55:09

标签: zend-framework2 zend-route

假设我有一个相当标准的路由定义,例如用户资料:

'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'条目,但没有快乐。

2 个答案:

答案 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'))

也应该能够产生正确的链接。

http://zf2cheatsheet.com/

还有一个非常有用的zf2备忘单