Routing 如何编写ZF2路由器脚本以允许默认操作上的参数

Routing 如何编写ZF2路由器脚本以允许默认操作上的参数,routing,zend-framework2,url-routing,Routing,Zend Framework2,Url Routing,我试图绕过ZF2中路由语句的一些特性。相册模块示例建议如下: 'router' => array( 'routes' => array( 'album' => array( 'type' => 'segment', 'options' => array( 'route' => '/album[/:action][/:id]',

我试图绕过ZF2中路由语句的一些特性。相册模块示例建议如下:

'router' => array(
    'routes' => array(
        'album' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/album[/:action][/:id]',
                'constraints' => array(
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id'     => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Album\Controller\Album',
                    'action'     => 'index',
                ),
            ),
        ),
    ),
),
    <a href="<?php echo $this->url('album',
        array('action'=>'index', 'agr1' => 'jazz'));?>">Jazz</a>
但是,假设我想配置该项目,使url
/album/index/jazz
只列出爵士乐类型的专辑

我的第一个挑战是,在
/album/index/jazz
中,第二个参数不是
[/:id]
。它想要成为
[/:流派]
。而且,虽然我可以轻松地将路由更改为
'route'=>'/album[/:action][/:arg1]'
,并将约束更改为
'arg1'=>'[a-zA-Z][a-zA-Z0-9.-]*'
,但我真的不想放弃
'[0-9]+'
,id上的约束。我要寻找的是一种根据动作定义替代参数模式和约束的方法

我的第二个挑战在于ZF2对默认操作的处理。如果我按如下方式设置路由:

'router' => array(
    'routes' => array(
        'album' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/album[/:action][/:arg1]',
                'constraints' => array(
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'arg1'   => '[a-zA-Z][a-zA-Z0-9_-]*',
                ),
                'defaults' => array(
                    'controller' => 'Album\Controller\Album',
                    'action'     => 'index',
                ),
            ),
        ),
    ),
),
然后url
/album/index/jazz
将按照我的要求向控制器发送“jazz”参数。但是,我在让ZF2使用默认操作构造url时遇到了一个问题。按照相册模块示例中的
index.phtml
语法,我的期望是:

'router' => array(
    'routes' => array(
        'album' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/album[/:action][/:id]',
                'constraints' => array(
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id'     => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Album\Controller\Album',
                    'action'     => 'index',
                ),
            ),
        ),
    ),
),
    <a href="<?php echo $this->url('album',
        array('action'=>'index', 'agr1' => 'jazz'));?>">Jazz</a>


将构造
。但是(我假设索引是默认操作),索引被剥离,ZF2给出了
,而不是针对真实页面。我试着在路由器、控制器和视图中重命名
索引
;但是我发现只要是默认操作,
$this->url(…)
函数就会去掉我使用的任何名称。围绕这个问题可能有很多方法,但我认为最好在路由器配置中解决它,以避免框架的其他未知部分出现意外,这些未知部分可能会以类似的方式处理默认操作。

值得退一步,决定您希望url方案如何工作,然后找出如何实现它

如果我在做类似的事情,我可能会这样开始:

/相册[/:类别]-列出所有相册,可选择按类别过滤

/albums/:id-显示有关单个相册的信息

/albums/:id/edit-显示表单以编辑相册信息并接受帖子

/albums/:id/delete-仅发布,删除相册

/albums/new-用于添加相册和接受帖子的显示表单

我建议不要在路线中使用通用名词(因此,避免:action或:arg1)。相反,要明确,所有的事情通常都是有效的


对于第一个循环,只需显式指定每个路由。一旦你了解了这一点,你就可以开始研究使用子路由将它们组合在一起。

我找到了一种方法来解决
url()
帮助器配置的url中忽略默认参数的问题。当zf2从route语句开发url时,它会删除
[]
括号内与默认参数匹配的所有内容。所以,

    <a href="<?php echo $this->url('album',
        array('action'=>'index', 'arg1' => 'jazz'));?>">Jazz</a>

然后


您是否定义了其他路线?您希望生成的url与您提供的路由定义不相关——路径以
/pages
开头,而基于该
相册
路由定义,它应该以
/album
开头。我的坏消息。我从不同版本的项目中剪切和粘贴。我已经编辑了我的问题。你解决了这个问题吗?我要么删除默认操作,要么停止让ZF构造URL。是的。看看我的答案。
    <a href="<?php echo $this->url('album',
        array('action'=>'index', 'arg1' => 'jazz'));?>">Jazz</a>
'router' => array(
    'routes' => array(
        'albums' => array(
            ...
                'route'    => '/albums[/][:action] [/][:arg1] [/][:arg2] [/][:arg3]   ...  ',
            ...
        ),
        'album' => array(
            ...
                'route'    => '/album[/][:action][/][:id]',
            ...
        ),
    ),
),