Zend Framework主机名路由:忽略子域时进行路由

时间:2011-01-19 19:02:13

标签: zend-framework

所以我想创建一个匹配以下内容的Zend_Controller_Router_Route_Hostname

  • example.com
  • www.example.com
  • stage.example.com
  • dev.example.com
  • andrew.dev.example.com
  • joe.dev.example.com

我似乎无法弄清楚如何创建一个可以匹配所有这些东西的路线。在“example.com”之前可以有多个子域,因此它之前的所有内容并不重要。这是我到目前为止所做的:

$hostnameRoute = new Zend_Controller_Router_Route_Hostname(':sandbox.:environment.example.com', array('controller' => 'events', 'event-id' => $eventId));

2 个答案:

答案 0 :(得分:1)

你不能有一个路由用于非线性映射,有两个以上的选择,所以你必须使用多个;但是如果不知道每个域的目标,就很难给出任何例子。 假设example.comwww.example.com是相同的,并且都是默认路由,stagedev都映射到其respecitve模块(andreaw和{{1作为参数)(当然也加入了路由器):

joe

这将映射以下($stageRoute = new Zend_Controller_Router_Route_Hostname('stage.example.com', array('module' => 'stage'); $devRoute = new Zend_Controller_Router_Route_Hostname(':user.dev.example.com', array('module' => 'dev'); ):

  • :module/:controller/:actionstage.example.com
  • stage/index/indexdev.example.com
  • dev/index/indexjoe.example.com
  • dev/index/index/user/joewww.example.com

单词:如果sudomain为default/index/index而没有其他内容,请使用默认参数转到stage模块。如果stagesubdomain,请使用参数dev转到dev模块。否则使用默认的zend路线 请注意,主机名路由器确实匹配任何路径。所以你可能应该将它背后的路径与另一条路线匹配并使用chain router

对于舞台路线,这可能如下所示:

user

$stageRoute = new Zend_Controller_Router_Route_Hostname('stage.example.com', array('module' => 'stage'); $pathRoute = new Zend_Controller_Router_Route(':revision', array('controller' => 'browse')); $stageRoute->chain($pathRoute); 映射到stage.example.com/5434

答案 1 :(得分:1)

我认为在单个主机名路由中有多个子域匹配是不可能的。所以这就是你要做的事情:

$hostnameRoutes = array(
    new Zend_Controller_Router_Route_Hostname('example.com', array('controller' => 'events', 'event-id' => $eventId)),
    new Zend_Controller_Router_Route_Hostname(':subdomain.example.com', array('controller' => 'events', 'event-id' => $eventId)),
    new Zend_Controller_Router_Route_Hostname(':sandbox.dev.example.com', array('controller' => 'events', 'event-id' => $eventId))
);

$homepageRoute =         new Zend_Controller_Router_Route_Static('',       array('action' => 'overview'));
$eventPagesRoute =       new Zend_Controller_Router_Route(':action/*',     array('action' => 'overview'));
$staticEventPagesRoute = new Zend_Controller_Router_Route('page/:page-id', array('action' => 'static-page'));

foreach ($hostnameRoutes as $i => $hostnameRoute) {
    $router->addRoute('sports_homepage' . $i,          $hostnameRoute->chain($homepageRoute));
    $router->addRoute('sports_event_pages' . $i,       $hostnameRoute->chain($eventPagesRoute));
    $router->addRoute('sports_static_event_Page' . $i, $hostnameRoute->chain($staticEventPagesRoute));
}

注意:确保您的路线名称是唯一的(请注意连接$i以使其唯一)。我第一次忘记了,无法弄清楚它为什么不起作用。