2015-11-09 2 views
0

Я только начал использовать 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/ 

Есть ли способ, чтобы не отображать search, page, date, log, если этот параметр не задан. Возможно, есть способ поставить условие в поле specsettings-users-list маршрут в module.config.php.

ответ

2

В вашем случае я бы предложил, чтобы не добавлять поисковый Params как search, page, date и log вашего маршрут на всех. Это параметры запроса, и для этого помощника URL-адреса ZF2 есть специальный ключ query. Вы также можете найти это в абзаце Query String Arguments в документации по вспомогательному оборудованию ZF2 url. В вашем случае вы можете использовать его как это:

$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); 
Смежные вопросы