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

时间:2014-03-21 17:12:18

标签: routing zend-framework2 url-routing

我试图绕过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',
                ),
            ),
        ),
    ),
),

但是,我想说,我想配置项目,以便网址/album/index/jazz仅列出爵士流派中的专辑。

我的第一个挑战是在/album/index/jazz中,第二个参数不是[/:id]。它希望成为[/:genre]。而且,虽然我可以轻松地将路由更改为'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时遇到问题。遵循Album模块示例中index.phtml的语法,我的期望如下:

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

将构建<a href="/album/index/jazz "> Jazz </a>。但是(我假设因为索引是默认操作)索引被剥离而ZF2给出<a href="/album/jazz ">Jazz</a>,它不会以真实页面为目标。我尝试将index重命名为路由器,控制器和视图中的不同内容;但是我发现只要它是默认动作,$this->url( … )函数就会删除我使用的任何名称。围绕这个问题可能有很多方法,但我认为最好在路由器配置中解决它,以避免与框架中可能类似地处理默认操作的框架的其他未知部分出现意外。

2 个答案:

答案 0 :(得分:1)

退一步决定你希望你的url方案如何工作,然后弄清楚如何实现它是值得的。

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

/ albums [/:category] ​​ - 列出所有相册,可选择按类别

进行过滤

/ albums /:id - 显示有关单个专辑的信息

/ albums /:id / edit - 显示用于编辑相册信息的表单,并接受POST

/ albums /:id / delete - 仅限POST,删除相册

/ albums / new - 显示添加相册的表单,然后接受POST。

我建议不要在你的路线中使用通用名词(因此,避免:动作,或:arg1)。相反,要明确,一切通常都有效。

首次复飞时,只需明确指定每条路线。一旦你了解了它,你就可以开始研究如何使用子路径将它们组合在一起。

答案 1 :(得分:0)

我找到了一种解决问题的方法,即默认参数会从url()帮助程序配置的网址中省略。当zf2从路由语句中开发url时,它会删除[]括号内与默认参数匹配的所有内容。因此,

    <a href="<?php echo $this->url('album',
        array('action'=>'index', 'arg1' => 'jazz'));?>">Jazz</a>
当我在问题中提出路径语句包含<a href="/album/jazz">Jazz</a>时,

构造<a href="/album/index/jazz">Jazz</a>而不是'route' => '/album[/:action][/:arg1]',。但是,如果我从参数中突破/字符并将其赋予其自己的[]括号,则url()帮助程序仅删除:action部分的网址。换句话说,如果我替换

                'route'    => '/album[/:action][/:arg1]',

                'route'    => '/album[/][:action][/][:arg1]',

然后

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

构造<a href="/album//jazz ">Jazz</a>,指向它应该的页面。

我也从timdev的答案中得到了很多答案,&#34;退一步决定你的网址方案是怎样的,这是值得的。工作,然后弄清楚如何实现它。&#34;如果我想在查询,过滤和排序数据方面添加大量的花里胡哨,index动作(管理多个专辑)将需要采用完全不同的参数集比addeditdelete操作(每次只管理一张专辑。)所以我设置了两条路线:

'router' => array(
    'routes' => array(
        'albums' => array(
            ...
                'route'    => '/albums[/][:action] [/][:arg1] [/][:arg2] [/][:arg3]   ...  ',
            ...
        ),
        'album' => array(
            ...
                'route'    => '/album[/][:action][/][:id]',
            ...
        ),
    ),
),