Zend Framework Router динамические маршруты - PullRequest
1 голос
/ 17 марта 2011

Я столкнулся с проблемой, и я не могу найти хорошее решение, чтобы она работала.Мне нужно сделать несколько динамических маршрутов в проекте Zend Framework.Я кратко объясню, в чем заключается моя проблема:

Мне нужны динамические настраиваемые маршруты, которые «расширяют» маршрут по умолчанию (module/controller/action/params).У проекта, в котором я работаю, есть несколько партнеров, и маршруты должны работать с ними.Для хранения партнеров я создал статический класс, и он выглядит следующим образом.

<?php
    class App_Partner
    {
        static public $partners = array(
            array(
                'name' => 'partner1',
                'picture' => 'partner1.jpg'
            ),
            array(
                'name' => 'partner2',
                'picture' => 'partner2.jpg'
            ),
            array(
                'name' => 'partner3',
                'picture' => 'partner3.jpg'
            )
        );
        static public function routePartners() {
            $partners = array();

            foreach(self::$partners as $partner) {
                array_push($partners, strtolower($partner['name']));
            }
            $regex = '(' . implode('|', $partners) . ')';

            return $regex;
        }
    }

Итак, App_Partner::routePartners() возвращает мне строку типа (partner1|partner2|partner3), которую я использую для создания правильных маршрутов.Моя цель - создать собственные маршруты для каждого партнера для каждого маршрута, который я установил в Bootstrap.Поэтому, если у меня установлен маршрут add-product.html, я хочу, чтобы он работал для каждого партнера как partner1/add-product.html, partner2/add-product.html и partner3/add-product.html.Кроме того, partner1/, partner2/, partner3 должен направлять на default/index/index.

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

<?php
$routeProposal = new Zend_Controller_Router_Route_Regex(
    App_Partner::routePartners() . '?/?proposals.html',
    array(
        'module' => 'default',
        'controller' => 'proposal',
        'action' => 'index',
        'page' => 1
    ),
    array( 1 => 'partner'),
    "%s/proposals.html"
);
$router->addRoute('proposal', $routeProposal);

Проблема

Приведенный выше маршрут работает нормально, если я использую партнера в URI запроса, но если нет, я получаю двойную косую черту, например public//proposals.html, из-за обратного маршрутаустановите на маршруте выше значение "%s/proposals.html".Кажется, я не могу найти способ избежать этого обратного маршрута, потому что я строю свои URL с помощью помощника просмотра URL , и если обратный маршрут не установлен, я получаю исключение, сообщающее об этом.

Мне также нужны маршруты для работы без набора партнеров, который будет использоваться по умолчанию (add-product.html, proposals.html и т. Д.).

Ответы [ 2 ]

6 голосов
/ 17 марта 2011

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

Вот аналогичный вопрос, но с использованием имени хоста route: Zend Framework: получить параметр поддомена из маршрута .Я адаптировал его для решения вашей проблемы, просто поместите в ваш Bootstrap.php следующее для инициализации маршрутизации:

protected function _initRoute()
{
    $this->bootstrap('FrontController');
    $router = $this->getResource('FrontController')->getRouter();

    // Default route
    $router->removeDefaultRoutes();
    $defaultRoute = new Zend_Controller_Router_Route(
                    ':controller/:action/*',
                    array(
                        'module' => 'default',
                        'controller' => 'index',
                        'action' => 'index',
                    )
    );
    $router->addRoute('default', $defaultRoute);

    $partnerRoute = new Zend_Controller_Router_Route(
        ':partner',
        array('partner' => 'none'),
        array('partner' => '^(partner1|partner2|partner3)$')
    );
    $router->addRoute('partner', $partnerRoute->chain($defaultRoute));
}

Измените по своему усмотрению.В ваших контроллерах вы получите значение для параметра партнера только в том случае, если оно действительно задано И действительное (вы получите ошибку маршрутизации, если партнера не существует) ...

1 голос
/ 17 марта 2011

Я использую аналогичный процесс для обнаружения lang в моем маршруте (но с файлом ini).

Можно использовать значение по умолчанию для параметра «Партнеры», чтобы маршрут работал без партнера, и добавить ? к своему регулярному выражению.

Но на самом деле, я не знаю, как избежать двойного // ...

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Для вашей информации, вот упрощенная версия моего маршрута с языком:

routes.lang.type = "Zend_Controller_Router_Route"
routes.lang.route = "lang/:language/*"
routes.lang.reqs.language = "^(en|fr|nl|de)?$"
routes.lang.defaults.language = none
routes.lang.defaults.module = default
routes.lang.defaults.controller = index
routes.lang.defaults.action = language
...