Zend_Controller_Router_Exception: "xyz" не указан

У меня проблема в моем текущем приложении Zend Framework.

В моем Bootstrap я регистрирую эти маршруты:

protected function _initRouter() { $this->bootstrap("FrontController"); $frontController = $this->getResource("FrontController"); $route = new Zend_Controller_Router_Route( ":module/:id", array( "controller" => "index", "action" => "index" ), array("id" => "\d+") ); $frontController->getRouter()->addRoute('shortcutOne', $route); $route = new Zend_Controller_Router_Route( ":module/:controller/:id", array("action" => "index"), array("id" => "\d+") ); $frontController->getRouter()->addRoute('shortcutTwo', $route); $route = new Zend_Controller_Router_Route( ":module/:controller/:action/:id", null, array("id" => "\d+", "action" => "\w+") ); $frontController->getRouter()->addRoute('shortcutThree', $route); } 

Теперь я добавил Zend_Navigation в свой проект. У меня есть несколько модулей, которые регистрируют элементы навигации в бутстрапе модуля:

 <?php class Contact_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initNavigation() { $layout = $this->getApplication()->getResource("layout"); $view = $layout->getView(); $config = new Zend_Config_Xml(dirname(__FILE__)."/config/navigation.xml", "nav"); $view->navigation()->addPage($config); } } 

Когда я открываю приложение в своем браузере, все работает нормально. Это означает, что я вижу навигацию и нажимаю на ее ссылки для просмотра указанной страницы. Но когда я нажимаю страницу, использующую маршрут: module /: action /: id, помощник навигации генерирует исключение Zend_Controller_Router_Route:

Неустранимая ошибка: Zend_Controller_Router_Exception: id не указан в C: \ Entwicklung \ kt \ trunk \ src \ library \ Zend \ View \ Helper \ Navigation \ HelperAbstract.php в строке 519

Кто-нибудь из вас тоже испытал эту ошибку? Было бы здорово, если бы вы могли помочь мне или дать мне совет. Также, если вам нужна дополнительная информация о моей настройке и т. Д., Просто скажите мне.

Спасибо!

Я нашел решение самостоятельно.

Эта проблема была вызвана не очень благоприятным поведением элементов Zend_Navigation. В методе getHref () они используют хелпер URL. Этот помощник создает URL-адрес, с которым должна ссылаться навигационная запись, принимая аргументы, указанные для элемента навигации (модуль, контроллер, действие и т. Д.).

Теперь проблема заключается в том, что если вы создали собственный маршрут в своем бутстрапе так же, как я, например

 ":module/:controller/:id" 

Вы столкнулись с проблемой, что, когда этот маршрут используется, хелпер URL-адреса использует этот маршрут для создания ссылки для записи навигации. Однако я не передал дополнительный параметр «id», поэтому я получил исключение.

Таким образом, одним из решений является передача дополнительного параметра для каждого экземпляра Zend_Navigation_Page_Mvc «route», который установлен на «default».

Еще одно решение, которое я еще не пробовал, заключается в том, чтобы новый пользовательский маршрут просто переквалифицировал себя на маршрут по умолчанию, например:

 ":module/:controller/:action/id/$id" 

Но я не знаю, есть ли у вас возможности с Zend Framework сделать это.

 $route = new Zend_Controller_Router_Route( "info/:id", array( "controller" => "index", "action" => "index" ), array("id" => "\d+") ); 

изменился на

 $route = new Zend_Controller_Router_Route( "info/:id", array( "controller" => "index", "action" => "index", "id" => "default" ) ); 

работал для меня, но, вероятно, это не лучший способ пойти

Я столкнулся с той же проблемой, и вот решение, которое сработало для меня: я добавил параметр маршрута ко всем моим ссылкам в файле navigation.xml, как показано ниже

  <?xml version="1.0" encoding="UTF-8"?> <navigation> <mainmenu> <home> <label>topmenu:homepage</label> ===> <route>default</route> <=== <module>default</module> <controller>index</controller> <action>index</action> </home> </mainmenu> </navigation> по  <?xml version="1.0" encoding="UTF-8"?> <navigation> <mainmenu> <home> <label>topmenu:homepage</label> ===> <route>default</route> <=== <module>default</module> <controller>index</controller> <action>index</action> </home> </mainmenu> </navigation> 

В этом маршруте «: module /: controller /: id» вам нужно просто определить значение по умолчанию для: id

Пример:

 <content type="Zend_Controller_Router_Route"> <route>content/:engine</route> <defaults module="content" controller="engine" action="index" engine="" /> </content> 

Извините за мой английский 🙂

С уважением.

Я только что столкнулся с проблемой, похожей на вашу, но нашел для нее другое обходное решение. Я расскажу об этом здесь только ради информации.

Как и вы, моя проблема заключалась в том, что моя навигация была построена с использованием последнего используемого маршрута. Это означало, что если один из моих пользовательских маршрутов был использован, я бы получил стопку исключений, жалующихся на некоторые пользовательские параметры для данного заданного маршрута, которые не определены.

Большинство параметров пользовательских параметров моих маршрутов по умолчанию имеют значение null в определении маршрута. Я обнаружил, что вместо того, чтобы изменить значение по умолчанию на «", исключение фактически исчезнет. Я не мог этого понять, поэтому начал немного погулять и наткнулся на ваш пост, который привел меня на правильный путь – я думаю.

Мои навигационные элементы хранятся в базе данных, поэтому я могу сгенерировать все мои элементы Zend_Navigation_Page по запросу и передать контейнер в мои помощники вида (я делаю сериализацию своего объекта-контейнера, чтобы сделать его кешируемым, но это не актуально прямо сейчас). Я действительно не нашел, что изменение значения по умолчанию params для '' показало, что это «хороший» способ сделать это, поэтому намекнул ваш пост. Я попытался изменить все элементы страницы, хранящиеся в моей базе данных, для использования маршрута named 'default', если они явно не предназначены для использования пользовательского маршрута и имеют параметры, определенные для него. Явное определение моих навигационных точек для использования маршрута по умолчанию, похоже, тоже помогло, и для меня это кажется более чистым обходным путем.

Спасибо за намек на то, что вызывало эту ошибку – за исключением, я действительно не знал, с чего начать 🙂

Я вижу здесь два решения:

  1. Вы можете установить значение по умолчанию для параметров маршрута в _initRouter (), но это может быть не то, что вы хотите (например, в этом случае этот маршрут может использоваться, когда вы этого не хотите)

  2. Вы можете указать параметры маршрута в файле navigation.xml (свойство params). Если вы не хотите устанавливать их исправленными, вам нужно будет написать PHP-код для генерации навигационного xml.