路由定义中的条件

Condition inside route definition

我刚开始使用ZendFramework 2。我在我的 module.config.php 中定义了一条路线,我想在我的视图中使用 $this->url 来生成 url.

module.config.php

'settings-users-list' => array(
    'type'    => 'Zend\Mvc\Router\Http\Regex',
    'options' => array(
        'regex' => '/settings((/role/(?<role>[a-zA-Z]+))|)((/search/(?<search>[a-zA-Z0-9_-]+))|)((/page/(?<page>[0-9]+))|)((/date/(?<date>asc|desc))|)((/log/(?<log>asc|desc))|)',
        'defaults' => array(
            'controller' => 'Admin\Controller\Settings',
            'action' => 'index',
        ),
        'spec' => '/settings/role/%role%/search/%search%/page/%page%/date/%date%/log/%log%',
    ),
),

In my view

echo $this->url('admin/settings-users-list',$link_params,array('force_canonical' => true));

哪里

$link_params = array(
    'controller' => 'settings',
    'action'     => 'index',
    'role'       => 'admin',
    'search'     => '',
    'page'       => '', 
    'date'       => '', 
    'log'        => '', 
);

我的问题是,当我的一部分参数为空时,生成的 url 不是所需的参数。在这种情况下,生成的 url 是:

www.mysite.com/admin/settings/role/admin/search//page//date//log/

有没有办法在不设置这个参数的情况下不显示searchpagedatelog。也许有没有办法在 module.config.php.

settings-users-list 路由的 spec 字段中放置一个条件

在您的情况下,我建议您根本不要将 searchpagedatelog 等搜索参数添加到您的路线中。这些是查询参数,对于此 ZF2 url 帮助器,选项中有一个特殊的 query 键。您还可以在 ZF2 url 查看帮助程序文档的 Query String Arguments 段中找到它。在您的情况下,您可以这样使用它:

$params = array(
    'controller' => 'settings',
    'action'     => 'index',
    'role'       => 'admin'
);

$query = array(
    'search'     => '',
    'page'       => '', 
    'date'       => '', 
    'log'        => ''
);

$options = array(
   'force_canonical' => true,
   'query' => $query
);

echo $this->url('admin/settings-users-list', $params, $options);

我还建议简化您的路由器。如果没有正则表达式,它将更具可读性:

'settings' => array(
    'type'    => 'Literal',
    'options' => array(
        'route' => '/settings'
    )
    'may_terminate' => false,
    'child_routes' => array(
        'role' => array(
            'type'    => 'Segment',
            'options' => array(
                'route' => '/role/:role'
                'constraints' => array(
                    'role' => '[a-zA-Z]*'
                ),
                'defaults' => array(
                    'controller' => 'Application\Controller\Settings',
                    'action' => 'index',
                )
            )
        )
    )
),

那么你可以这样做:

echo $this->url('settings/role', $params, $options);