Как маршрутизировать мульти-поддомен с именем хоста маршрутизатора zend

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

Что я хочу сделать, так это маршрутизировать субдомен следующим образом:

www.site.com -> статический роутер

a.site.com и b.site.com -> контроллер категорий

c.site.com и d.site.com -> контроллер местоположения

остальной поддомен -> пользовательский контроллер

может ли кто-нибудь подсказать мне, как это решить, спасибо.

ОБНОВИТЬ:

Сначала спасибо, Fge, проголосуйте за свой ответ, он работает, но мне нужен еще совет:

  1. Поскольку у меня много поддоменов для каждого правила, есть лучший способ, чем добавлять правила в цикле

    foreach ($ subdomains as $ a) {$ tr = new Zend_Controller_Router_Route_Hostname ("$ a.site.com", array ('module' => 'mod', 'controller' => 'ctrl', 'param_1' => $ а)); $ router-> addRoute ($ a, $ tr); }

  2. Как объединить его с другим типом маршрутизации для анализа параметров (с цепочкой?), Например, http://a.site.com/:b/:c, я хочу разобрать его на param_1 (a), param_2 (b), param_2 (c)


person Komang    schedule 10.11.2010    source источник
comment
извините, кажется, отформатированный код не работает?   -  person Komang    schedule 10.11.2010


Ответы (1)


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

(Zend_Controller_Router)

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

$user = new Zend_Controller_Router_Route_Hostname(
    ':subdomain.site.com',
    array(
        'controller' => 'user'
    )
);
$location1 = new Zend_Controller_Router_Route_Hostname(
    'c.site.com',
    array(
        'controller' => 'location'
    )
);
$location1 = new Zend_Controller_Router_Route_Hostname(
    'd.site.com',
    array(
        'controller' => 'location'
    )
);
// other definitions with known subdomain
$router->addRoute($user);   // most general one added first
$router->addRoute($location1);
$router->addRoute($location2);
// add all other subdomains

Обновление для обновленного вопроса:
1) Это действительно зависит от того, насколько разные параметры вы хотите маршрутизировать поддомен. В вашем примере вы направили их все в одну и ту же модель и контроллер и добавили фактический субдомен в качестве параметра. Это легко сделать с помощью пользовательского маршрута, который я разместил выше. Здесь поддомен устанавливается как параметр subdomain ($request->getParam("subdomain")). Если вы хотите, чтобы поддомены были действием известного контроллера / модели, вы можете заменить :subdomain на :action. Но как только у вас появятся другие контроллеры / модели для каждого поддомена, я боюсь, что вам придется их перебирать (или использовать файл конфигурации). В примере, который вы указали в вопросе, маршрут может выглядеть так:

$user = new Zend_Controller_Router_Route_Hostname(
    ':param1.site.com',
    array(
        'controller' => 'user'
    )
);
// routes "subdomain".site.com to defaultModul/userController/indexAction with additional parameter param1 => subdomain.

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

2) Это пример, когда router цепи вступают в игру. Внешний маршрут будет маршрутом имени хоста, который обрабатывает поддомен, а внутренний маршрут будет обрабатывать часть :a/:b. Это может выглядеть, например, так:

$user->chain(new Zend_Controller_Router_Route(':a/:b'));
person Fge    schedule 10.11.2010
comment
спасибо, это работает, проголосовали за ваш ответ, но, пожалуйста, взгляните на мое обновление выше. - person Komang; 10.11.2010