【问题标题】:How to write the ZF2 router script to allow parameters on the default action如何编写 ZF2 路由器脚本以允许默认操作上的参数
【发布时间】: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>

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

【问题讨论】:

  • 你定义了其他路由吗?您希望生成的 url 与您提供的路由定义无关——路径以 /pages 开头,而基于 album 路由定义,它应该以 /album 开头。
  • 我的错。我从项目的不同版本中剪切和粘贴。我已经编辑了我的问题。
  • 您解决了这个问题吗?我要么不得不删除默认操作,要么停止让 ZF 构造 url。
  • 是的。看我的回答。

标签: routing zend-framework2 url-routing


【解决方案1】:

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

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

/albums[/:category] ​​- 列出所有专辑,可选择按类别过滤

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

/albums/:id/edit - 显示一个表单来编辑专辑信息,并接受 POST

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

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

我建议不要在您的路线中使用通用名词(因此,请避免使用 :action 或 :arg1)。相反,要明确,一切通常都会正常工作。

对于第一次复飞,只需明确指定每条路线。一旦你明白了这一点,你就可以开始考虑使用子路由将它们组合在一起。

【讨论】:

    【解决方案2】:

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

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

    构造&lt;a href="/album/jazz"&gt;Jazz&lt;/a&gt; 而不是&lt;a href="/album/index/jazz"&gt;Jazz&lt;/a&gt; 当路由语句包含'route' =&gt; '/album[/:action][/:arg1]', 时,正如我在问题中提出的那样。但是,如果我从参数中分出/ 字符并将其赋予自己的[] 括号,则url() 助手只会删除url 的:action 部分。换句话说,如果我替换

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

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

    然后

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

    构造&lt;a href="/album//jazz "&gt;Jazz&lt;/a&gt;,它指向它应该指向的页面。


    我也从timdev 的回答中得到了很多,“后退一步,决定你希望你的 url 方案如何工作,然后弄清楚如何实现它是值得的。”如果我想为我想要查询、过滤和排序数据的方式添加一大堆花里胡哨,index 操作(管理多个专辑)将要采用与addeditdelete 操作(每个操作一次只管理一个专辑。)所以我设置了两条路线:

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

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2013-01-22
      相关资源
      最近更新 更多