Как маршрутизировать мультидомен с именем хоста Zend-маршрутизатора - PullRequest
5 голосов
/ 10 ноября 2010

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

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

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

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

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

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

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

UPDATE:

Во-первых, спасибо, Фге, проголосуй за ответ, он работает, но мне нужен еще совет:

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

    foreach ($ поддоменами как $ a) { $ tr = новый Zend_Controller_Router_Route_Hostname ( "$ A.site.com", массив ( 'module' => 'mod', 'controller' => 'ctrl', 'param_1' => $ a )); $ Router-> addRoute ($ а, $ тр); }

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

1 Ответ

6 голосов
/ 10 ноября 2010

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

(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) Это действительно зависит от того, насколько разными параметрами вы хотите перенаправить поддомен. В вашем примере вы перенаправили их все на одну и ту же модель и контроллер и добавили фактический поддомен в качестве параметра. Это можно легко сделать с помощью пользовательского маршрута, который я разместил выше. Там субдомен задается как субдомен параметра ($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) Это пример, когда цепочки маршрутизаторов вступают в игру. Внешний маршрут будет маршрутом имени хоста, который обрабатывает поддомен, а внутренний маршрут будет обрабатывать часть :a/:b. Например, это может выглядеть так:

$user->chain(new Zend_Controller_Router_Route(':a/:b'));
...