5

我需要在 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) , 参数_2 (c)

4

1 回答 1

6

注意:反向匹配
路由以相反的顺序匹配,因此请确保首先定义最通用的路由。

(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'));
于 2010-11-10T08:52:06.250 回答