2011-03-17 310 views
1

我碰到一个问题,我似乎无法找到一个好的解决方案,使其工作。我必须在Zend Framework项目中制作一些动态路线。我会很快解释我的问题是什么:Zend Framework路由器动态路由

我需要动态的自定义路由“扩展”默认路由(module/controller/action/params)。我为之工作的项目有几个合作伙伴,路线必须与这些合作。 要存储我创建静态类的伙伴,它看起来像这样。

<?php 
    class App_Partner 
    { 
     static public $partners = array(
      array(
       'name' => 'partner1', 
       'picture' => 'partner1.jpg' 
      ), 
      array(
       'name' => 'partner2', 
       'picture' => 'partner2.jpg' 
      ), 
      array(
       'name' => 'partner3', 
       'picture' => 'partner3.jpg' 
      ) 
     ); 
     static public function routePartners() { 
      $partners = array(); 

      foreach(self::$partners as $partner) { 
       array_push($partners, strtolower($partner['name'])); 
      } 
      $regex = '(' . implode('|', $partners) . ')'; 

      return $regex; 
     } 
    } 

所以App_Partner::routePartners()我返回一个字符串像(partner1|partner2|partner3),我用它来创建正确的路线。我的目标是为我在Bootstrap中设置的每条路线设置每个合作伙伴的自定义路线。所以如果我有一条路线add-product.html集,我希望它为每个合作伙伴工作partner1/add-product.html,partner2/add-product.htmlpartner3/add-product.html。 另外,partner1/,partner2/, partner3应该路由到default/index/index

事实上,我让这件事情使用下面的路线工作。

<?php 
$routeProposal = new Zend_Controller_Router_Route_Regex(
    App_Partner::routePartners() . '?/?proposals.html', 
    array(
     'module' => 'default', 
     'controller' => 'proposal', 
     'action' => 'index', 
     'page' => 1 
    ), 
    array(1 => 'partner'), 
    "%s/proposals.html" 
); 
$router->addRoute('proposal', $routeProposal); 

问题

上述路线工作正常,如果我使用请求URI的合作伙伴,但如果我不这样做,我得到双斜线状public//proposals.html因为在设置反向路线上面的路线是"%s/proposals.html"。我似乎无法找到一种方法来避免这种反向路由,因为我使用url查看助手来构建我的网址,如果没有设置反向路由,我会得到一个异常说明这一点。

我还需要没有伙伴设置的工作路线,这将是默认方式(add-product.htmlproposals.html等)。

+0

请问这有帮助吗? http://stackoverflow.com/questions/4626048/zend-framework-how-to-map-fully-dynamic-route – 2011-03-17 09:06:52

+0

我读过,但它不能帮助我太多。他的路线是独一无二的。我的地址是“可覆盖的” - 几条路由必须具有相同的名称,以便我可以使用基于路由名称的URL助手构建URL。 – 2011-03-17 09:23:03

+0

:-)他的路线是我的路线=相同的用户。我有一个解决方案,如果别人没有打败我,我会在后面写出来。 – 2011-03-17 09:47:31

回答

6

从你的描述,好像你正在寻找一个zend router chain,你的伴侣的可选链。

以下是一个类似的问题,但使用主机名路由:Zend Framework: get subdomain parameter from route。我适应它来解决你的问题,只是把你的bootstrap.php以下初始化路由:您认为合适的

protected function _initRoute() 
{ 
    $this->bootstrap('FrontController'); 
    $router = $this->getResource('FrontController')->getRouter(); 

    // Default route 
    $router->removeDefaultRoutes(); 
    $defaultRoute = new Zend_Controller_Router_Route(
        ':controller/:action/*', 
        array(
         'module' => 'default', 
         'controller' => 'index', 
         'action' => 'index', 
        ) 
    ); 
    $router->addRoute('default', $defaultRoute); 

    $partnerRoute = new Zend_Controller_Router_Route(
     ':partner', 
     array('partner' => 'none'), 
     array('partner' => '^(partner1|partner2|partner3)$') 
    ); 
    $router->addRoute('partner', $partnerRoute->chain($defaultRoute)); 
} 

变化。在您的控制器中,如果实际指定并且有效(如果合作伙伴不存在,您将得到路由错误),您将只获得伙伴参数的值...

1

我使用类似的过程来检测lang,在我的路线(但与一个ini文件)。

您可以使用默认值为您的伙伴参数,使路由工作没有合作伙伴,并添加一个?到您的正则表达式。

但实际上,我不知道如何避免双重// ...

希望有所帮助。

编辑:为了您的信息,这里是我的路线的简化版本语言:

routes.lang.type = "Zend_Controller_Router_Route" 
routes.lang.route = "lang/:language/*" 
routes.lang.reqs.language = "^(en|fr|nl|de)?$" 
routes.lang.defaults.language = none 
routes.lang.defaults.module = default 
routes.lang.defaults.controller = index 
routes.lang.defaults.action = language 
+0

事情是我无法使用默认字符串的情况下,我没有合作伙伴。这种方法基于路由中的强制字符串,与我发布的路由一起工作。这个问题似乎是在URL视图助手用来构建URL的反向路线上。 – 2011-03-17 09:20:32