ZEND - Конфликтующие шаблоны маршрутов

Я использую Zend framework 1.12, пытаюсь создать собственные маршруты.

Я пытаюсь создать что-то похожее на URL-адрес профиля facebook (http://facebook.com/username) . Итак, сначала я попробовал что-то вроде этого:

$router->addRoute(
            'eventName',
            new Zend_Controller_Router_Route(
                '/:eventName', 
                array(
                    'module' => 'default', 
                    'controller' => 'event', 
                    'action' => 'detail'
                )
            )
        );

Каждый раз, когда я пытался запустить mydomain.com/something, я получал следующую ошибку:

Неустранимая ошибка: неперехваченное исключение «Zend_Controller_Router_Exception» с сообщением «eventName не указано» в /var/desenvolvimento/padroes/zf/ZendFramework-1.12.0/library/Zend/Controller/Plugin/Broker.php в строке 336

Мало того, что я не смог заставить этот фрагмент кода работать, все мои маршруты по умолчанию (очевидно) были перезаписаны. Итак, у меня есть, например, такие вещи, как «mydomain.com/admin», которые должны отправить меня в модуль «admin» на контроллере индекса, но теперь возвращают ту же ошибку (поскольку она соответствует той же схеме, что и /: название события).

Что мне нужно сделать, так это создать этот настраиваемый маршрут, не перезаписывая маршруты по умолчанию и фактически работающий (dh).

Я уже проверил онлайн-документы и много (МНОГО) материала в Google, но я не нашел ничего, связанного с получаемой мной ошибкой или тем, как не перезаписывать маршруты по умолчанию. Буду признателен за все, что укажет мне правильное направление.

Спасибо.


РЕДАКТИРОВАТЬ: Мне удалось заставить его работать, но я вообще не использовал маршрутизацию. Я только что сделал плагин со следующим:

public function preDispatch(\Zend_Controller_Request_Abstract $request) {

    if (!\Zend_Controller_Front::getInstance()->getDispatcher()->isDispatchable($request)) {

        $request->setModuleName($this->_eventRouter["module"]);
        $request->setControllerName($this->_eventRouter["controller"]);
        $request->setActionName($this->_eventRouter["action"]);

    }

}

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

Я просто хотел бы знать, есть ли способ избежать использования плагина.


РЕДАКТИРОВАТЬ²: Я больше не занимаюсь этим дерьмовым плагином. Я выяснил, что вызвало ошибку маршрутизатора. В моем определении маршрутизации не было допустимого значения по умолчанию для переменной eventName. Мое исправление было:

$router->addRoute(
        'eventName',
        new Zend_Controller_Router_Route(
            '/:eventName', 
            array(
                'module' => 'default', 
                'controller' => 'event', 
                'action' => 'detail',
                'eventName' => ''
            )
        )
    );

Я по-прежнему не могу создавать маршруты с "конфликтующими" шаблонами, такими как / admin и /: eventName. Если бы только был способ заставить / admin переопределить /: eventName ...


person Pedro Cordeiro    schedule 30.10.2012    source источник


Ответы (4)


Маршруты применяются / сопоставляются на основе LIFO. Как указано в документах по маршрутизации:

Примечание. Маршруты с обратным соответствием сопоставляются в обратном порядке, поэтому сначала убедитесь, что ваши наиболее общие маршруты определены.

Итак, чтобы ваши «статические» маршруты (статические в том смысле, что они не исходят из базы данных, /admin и т.п.) применялись к вашим динамическим (/:eventName), убедитесь, что вы определили статические маршруты позже в потоке выполнения.

На практике это означает, что вы не можете определять свои статические маршруты во время начальной загрузки, поэтому вам придется делать это в плагине с крючком routeStartup. Возможно, два плагина: один для ваших динамических маршрутов, другой для статических, просто убедитесь, что установлен приоритет у плагинов, чтобы статические добавлялись позже.

person David Weinraub    schedule 26.11.2012
comment
Это именно то, что я хотел знать. Спасибо. - person Pedro Cordeiro; 26.11.2012

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

<a href="<?=$this->url(array('eventName' => 'foo'), 'eventName')?>">Something</a>

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

person Tim Fountain    schedule 30.10.2012

Поскольку вы используете Zend Framework 1.x

Вот решение, которое я добавил сюда: Как перенаправить страницу ошибки и выполнить маршруты в Zend Framework 1.x

Также, чтобы облегчить жизнь ... вот она:

I am still unable to create routes with "conflicting" patterns, such as /admin and /:eventName. If only there was a way to make /admin override /:eventName...

Как только вы находитесь на action, который вызывает ваше eventName, вы можете поставить галочку, если этот == admin, позже вы можете определить перенаправление, указав, какое действие необходимо загрузить, в самом этом условии.

Простой? :)

person Karma    schedule 23.11.2012
comment
Я не хочу перенаправлять страницы с ошибками, и я знаю, как настраивать маршруты в zend framework. Я не знаю, как создавать маршруты с конфликтующими шаблонами, такими как /: eventName и / admin. Каждый раз, когда я устанавливаю эти два маршрута и пытаюсь получить доступ к / admin, я попадаю в модуль / контроллер / действие /: eventName с помощью $ this- ›getRequest () -› getParam (eventName) == admin. - person Pedro Cordeiro; 23.11.2012
comment
Ждать. Насколько я понимаю. Вам нужен URL-адрес для таких пользователей, как Facebook, но вы хотите исключение для / admin ... это правильно? Потому что, если вы прочтете этот ответ еще раз, то, что я дал, было логикой для этого ... или вы хотите, чтобы я закодировал эту часть для вас? - person Karma; 25.11.2012

определите eventName, и даже если это не требуется, просто оставьте его пустым.

person jsteinmann    schedule 26.11.2012