Как написать цепочки маршрутизации для субдомена в Zend Framework в INI-файле маршрутизации? - PullRequest
5 голосов
/ 27 июня 2009

Я пытаюсь создать поддомен с помощью Zend Router, а затем для каждого раздела поддомена, такого как subdomain.site.com/section/, я создаю другой маршрут, а затем пытаюсь связать его с маршрутом субдомена. но я не знаю как. Я прочитал всю документацию, которую смог найти, и все форумы, но это заставляет меня понять это самостоятельно. Пока что мои попытки просто дают мне эту ошибку:

Исправляемая фатальная ошибка: аргумент 2 передан Zend_Controller_Router_Rewrite :: addRoute () должен реализовывать интерфейс Zend_Controller_Router_Route_Interface, задано нулевое значение, вызвано в /var/local/zend/library/Zend/Controller/Router/Rewrite.php в строке 155 и определяется в /var/local/zend/library/Zend/Controller/Router/Rewrite.php в строке 93

со следующим кодом:

routes.b2b.type = "Zend_Controller_Router_Route_Hostname"
routes.b2b.route = "sales.sitename.com"
routes.b2b.defaults.module = b2b
routes.b2b.defaults.controller = index
routes.b2b.defaults.action = index

routes.b2b_signup.type = "Zend_Controller_Router_Route_Static"
routes.b2b_signup.route = "/signup"
routes.b2b_signup.defaults.controller = "index"
routes.b2b_signup.defaults.action   = "signup"

routes.b2b_login.type = "Zend_Controller_Router_Route_Chain"
routes.b2b_login.chain = b2b_signup

Я не могу найти пример того, как сделать это с INI-файлом в сети. Все приложение написано в INI для конфигурации маршрутизации, поэтому я не могу переключить его на конфигурацию на основе массива (или XML в этом отношении), в которой находятся 100% примеров в Интернете.

Если бы я мог сделать это в виде массива, я мог бы просто сказать это:

$hostnameRoute = new Zend_Controller_Router_Route_Hostname(
    'sales.sitename.com',
    array(
        'controller' => 'index',
        'module'     => 'b2b',
        'action'     => 'index'
    )
);

$hostnameRoute = new Zend_Controller_Router_Route_Static(
    '/signup',
    array(
        'controller' => 'index',
        'module'     => 'b2b',
        'action'     => 'signup'
    )
);
    $chainedRoute = new Zend_Controller_Router_Route_Chain();
    $chainedRoute->chain($b2b_signup)

У кого-нибудь есть идеи, как это сделать в INI-файле?

1 Ответ

11 голосов
/ 27 июня 2009

Вот в основном то, что вы хотите, в формате INI:

routes.b2b.type = "Zend_Controller_Router_Route_Hostname"
routes.b2b.route = "sales.sitename.com"
; you could specify a default module (or anything) to use for the whole 
; route chain here, like so: 
; routes.b2b.defaults.module = "default"

routes.b2b.chains.signup.type = "Zend_Controller_Router_Route_Static"
routes.b2b.chains.signup.route = "/signup"
routes.b2b.chains.signup.defaults.controller = "index"
routes.b2b.chains.signup.defaults.action = "signup"

routes.b2b.chains.anotherroute.route = "/something/:foo" ; etc, etc.
routes.b2b.chains.anotherroute.defaults.action = "foo"
routes.b2b.chains.anotherroute.defaults.controller = "index"
routes.b2b.chains.anotherroute.defaults.foo = "bar"
routes.b2b.chains.anotherroute.reqs.foo = '[a-z]+'

Это даст вам следующие маршруты: b2b-signup и b2b-anotherroute.

Вот несколько важных замечаний о цепочке маршрутов:

При объединении маршрутов параметры внешнего маршрута имеют более высокий приоритет, чем параметры внутреннего маршрута. Таким образом, если вы определите контроллер во внешнем и внутреннем маршруте, будет выбран контроллер внешнего маршрута.

Родительские / дочерние цепочки имен всегда объединяются с тире! Таким образом, как в примере выше, b2b.chains.signup становится маршрутом с именем b2b-signup (который можно использовать для сборки URL и т. Д.).

Вы можете продолжать цепочку! Цепочки из цепочек могут иметь цепочки.

Дети цепных маршрутов не работают с подстановочными знаками. См. # ZF-6654 . Вот сообщение в блоге , в котором говорится о том, почему это не имеет большого значения.

...