2012-03-06 1 views
1

Моя ситуация такова: Приложение, в котором я работаю, использует поддомен для определения «кто» является клиентом. ie: client1.site.com, client2.site.com Все это работает нормально (и я не использую никаких специальных маршрутов).Как настроить Zend Route для использования дополнительного параметра перед параметрами MVC?

Теперь, однако, мне нужно поместить мой код в «тестовую» среду. В этом случае, однако, я ограничен одним поддоменом. т.е. static.testsite.com

Моя мысль заключалась в использовании Zend маршрутизации до такой степени, так что я могу преобразовать запрос следующим образом: static.testsite.com/client1/... или static.testsite.com/client2/...

Таким образом, первый параметр «» должен быть имя клиента с последующим стандартными параметрами MVC (модуль/контроллер/действие).

Я планирую добавить эту логику маршрутизации в routeStartup hook плагина контроллера, доступного только в тестовой среде.

Во-первых, есть ли более простой способ выполнить эту работу, о которой я не думал? Во-вторых, если нет, есть ли у кого-нибудь опыт такого рода требований?

В настоящее время я экспериментирую с различными маршрутами, которые предоставляет Zend, но до сих пор я не увенчался успехом (имя клиента продолжает становиться контроллером и т. Д.).

Любая помощь очень ценится. Спасибо.

Редактировать: Я попытался сделать это уродливо, манипулируя запросом uri объекта запроса. Однако это оставляет остальную часть сайта без части/clientX/в своих URL-адресах, тем самым вызывая дополнительные проблемы. И обновление всех местоположений с помощью/clientX/частей тоже не реально. Поэтому, хотя я могу получить клиент, остальная часть сайта остается нефункциональной, что заставляет меня думать, что Маршрут - единственный способ.

Редактировать # 2: Я получил его работу со следующим кодом;

// within a Controller Plugin at routeStartup 

    $oFrontController = Zend_Controller_Front::getInstance(); 
    $oRouter = $oFrontController->getRouter(); 

    $oNewDefaultRoute = new Zend_Controller_Router_Route(
      ':testClient/:controller/:action/*', 
      array(
       'module' => 'default', 
       'controller' => 'index', 
       'action' => 'index', 
       'testClient' => null, 
      ) 
     ); 

    $oRouter->addRoute('default', $oNewDefaultRoute); 

Проблема осталась, однако, поскольку она не влияет на какие-либо существующие URL-адреса. Поэтому попытка доступа к любому из них приводит к месту без testClient, что вызывает ошибки. Я считаю, что некоторые решения на основе сеанса после первоначального назначения клиента должны быть приняты.

Если, однако, кто-то знает более элегантный способ сделать это, дайте мне знать. Спасибо.

+0

Почему бы не использовать client1test.testsite.com? Фактически это отдельный клиент, но это позволяет вам иметь совершенно отдельный тест против производственной среды. – Ashley

+0

Это было бы идеально, поскольку на самом деле это не требовало бы никаких изменений.К сожалению, проблема в том, что это фактические домены/поддомены, и из-за этого я не могу создавать поддомены для каждого из этих клиентов в тестовой среде. Как упоминалось выше, «я ограничен одним поддоменом». –

+0

Является ли '/ clientX' частью _always_ в URL? У вас есть случаи, когда эта часть опущена, а первый параметр - модуль или контроллер? – bububaba

ответ

1

раствор предложение Ини на основе непроверенных - только для общей идеи:

routes.withClient.route = ":client/:module/:controller/:action/*" 
routes.withClient.defaults.module = "default" 
routes.withClient.defaults.controller = "index" 
routes.withClient.defaults.action = "index" 

Значение client доступной через $request->getParam('client').

+0

Спасибо bububaba. Я не тестировал это, так как я получил его в плагине контроллера. Однако вместо нового маршрута я вместо этого переписывал существующий маршрут по умолчанию. Я отметил это как ответ, потому что, похоже, нет никакого другого пути с Маршрутами, чтобы делать именно то, что я хочу. Спасибо за вашу помощь в любом случае. –