У меня есть и проблема с помощником вида функция this-> url (), которая не возвращает и URL-адрес из дочернего маршрута, и я получаю Белый экран мертвых. Когда я помещаю URL-адрес вручную в браузере, маршрутизатор хорошо распознает URL-адрес.
У меня есть это в моем module.config.php:
'news' => array(
'type' => 'Segment',
'options' => array(
'route' => '/news[/:id]',
'constraints' => array(
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Application\Controller\News',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'allnews' => array(
'type' => 'Segment',
'options' => array(
'route' => '[/:action[/:tab[/:page]]]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'tab' => '[0-9]+',
'page' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Application\Controller\News',
'action' => 'all',
'tab' => 1,
'page' => 1,
),
),
),
),
),
Например:
/news/2
Работает правильно и соответствует родительскому маршруту
А также:
/news/all/2/5
Работает правильно и соответствует дочернему маршруту.
Но когда я использую это в помощнике вида, я получаю Белый Экран Мертвых:
echo($this->url('news/allnews', array('action' => 'all', 'tab' => '1', 'page' => '1')));
Мой вопрос: что это не так ?? Я использовал этот метод в других взглядах и работал хорошо.
Вам не нужно использовать дочерние маршруты в сочетании с сегментами маршрутизатора. Один сегмент должен быть достаточным!
'news' => array(
'type' => 'Segment',
'options' => array(
'route' => '/news[/:action[/:id][/:tab][/:page]]',
'constraints' => array(
'id' => '[0-9]+',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'tab' => '[0-9]+',
'page' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Application\Controller\News',
'action' => 'index',
),
),
),
До тех пор, пока Defaultcontroller достаточно для ваших нужд, вам также не нужно иметь его в своих параметрах. Если вам нужно больше 1, вы, вероятно, захотите иметь другое ограничение, определяющее контроллер.
Теперь вы можете просто использовать url viewhelper различными способами.
если вам нужно только действие по умолчанию в вашем контроллере по умолчанию, вы можете написать его так.
$this->url('news');
Если вам нужно направить действия с параметрами, вы можете использовать видовой помощник так
$this->url('news', array('action' => $action, 'tab' => $tab, 'page' => $page));
В идеале я хотел бы использовать литерал маршрутизатора с сегментами маршрутизатора в качестве дочерних маршрутов, поскольку бомбардировка сегмента маршрутизатора множеством ограничений становится довольно грязной.
...
'custom_route' => array(
'type' => 'Literal',
'priority' => 1337,
'options' => array(
'route' => '/custom',
'defaults' => array(
'__NAMESPACE__' => 'Custom\Controller',
'controller' => 'Index',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'custom_child' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action]][/:id]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
),
),
),
),
),
...
Уверен, это не поможет, но все выглядит правильно в вашем маршруте … Вы пробовали
$this->url('news/allnews', array('action' => 'all', 'tab' => 1, 'page' => 1))
Не знаю, как средство маршрутизации обрабатывает ограничения на цифры и предоставляет строки для помощника вида URL.
Вам, вероятно, нужно либо включить ошибки, либо заглянуть в журнал, чтобы узнать фактическую ошибку