【发布时间】:2014-03-21 17:12:18
【问题描述】:
我正在尝试解决 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',
),
),
),
),
),
然后 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>。但是(我假设因为 index 是默认操作)索引被剥离,ZF2 给出了<a href="/album/jazz ">Jazz</a>,它不针对真实页面。我尝试在路由器、控制器和视图中将index 重命名为不同的名称;但发现只要它是默认操作,$this->url( … ) 函数就会删除我使用的任何名称。可能有很多方法可以解决这个问题,但我认为最好在路由器配置中解决它,以避免框架的其他未知部分可能会以类似方式处理默认操作。
【问题讨论】:
-
你定义了其他路由吗?您希望生成的 url 与您提供的路由定义无关——路径以
/pages开头,而基于album路由定义,它应该以/album开头。 -
我的错。我从项目的不同版本中剪切和粘贴。我已经编辑了我的问题。
-
您解决了这个问题吗?我要么不得不删除默认操作,要么停止让 ZF 构造 url。
-
是的。看我的回答。
标签: routing zend-framework2 url-routing