我试图解决 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',
),
),
),
),
),
但是,假设我想配置该项目,以便 url/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',
),
),
),
),
),
然后是网址/album/index/jazz
将按照我的意愿将“jazz”参数发送到控制器。但是,我在让 ZF2 使用默认操作构建 url 时遇到问题。遵循以下语法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( … )
函数将删除我使用的任何名称。解决这个问题可能有很多方法,但我认为最好在路由器配置中解决它,以避免框架的其他未知部分可能以类似的方式处理默认操作。