如何使用可变操作和键进行路由?

时间:2014-10-27 23:12:38

标签: php zend-framework routing routes zend-framework2

我在Zend Framework 2中工作,并且具有可变动作和主键。下面是我的模块路由器。我想根据动作将不同的ID传递给它(如果我删除了它将引用languageId的语言,如果我删除它将引用albumId的相册)。我是否需要为语言和专辑创建子路由,然后确定每个子路由使用的特定ID?或者有没有办法我可以说第二个参数将始终是一个数字,并且该操作将使用该数字执行所需的操作?

操作:deleteLanguage ID:languageId
ACtion:deleteAlbum ID:albumId

 'router' => array(
     'routes' => array(
         'pro' => array(
             'type'    => 'segment',
             'options' => array(
                 'route'    => '/pro[/][:action][/:id]',
                 'constraints' => array(
                     'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                     'language_id' => '[0-9]+',
                 ),

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

非常感谢, 中号

1 个答案:

答案 0 :(得分:0)

如果您完全记下配置,则只能在操作和标识符之间创建依赖关系。 ZF2没有方法根据其他参数值重命名参数名称(如果你仔细想想,有充分的理由没有这个功能)。

您有两种选择:

'pro' => [
    'type'    => 'literal',
    'options' => [
        'route'    => '/pro',
        'defaults' => [
            'controller' => 'Pro\Controller\Pro',
            'action'     => 'index',
        ],
        'may_terminate' => true,
        'child_routes' => [
            'delete-language' => [
                'type'    => 'segment',
                'options' => [
                    'route'    => '/delete-language/:language_id',
                    'defaults' => [
                        'action' => 'deleteLanguage'
                    ],
                    'constraints' => [
                        'language_id' => '[0-9]+'
                    ],
                ],
            ],
            'delete-album' => [
                'type'    => 'segment',
                'options' => [
                    'route'    => '/delete-album/:album_id',
                    'defaults' => [
                        'action' => 'deleteAlbum'
                    ],
                    'constraints' => [
                        'album_id' => '[0-9]+'
                    ],
                ],
            ],
        ],
    ],
]

或接受你处理" id"只有(这是更优选的imho):

'pro' => [
    'type'    => 'segment',
    'options' => [
        'route'    => '/pro[/:action[/:id]]',
        'defaults' => [
            'controller' => 'Pro\Controller\Pro',
            'action'     => 'index',
        ],
        'constraints' => [
            'id' => '[0-9]+'
        ],
    ],
]

此外,如果您按实体/域模型拆分控制器,它会有很大帮助。不要删除"语言"并删除了一张"专辑"在同一个控制器中。分开他们!在RESTful原则中考虑更多,它将使您的代码更加清晰。