Zend Framework路由器动态路由
我碰到一个问题,我似乎无法找到一个好的解决方案,使其工作。我必须在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.html
和partner3/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.html
,proposals.html
等)。
从你的描述,好像你正在寻找一个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));
}
变化。在您的控制器中,如果实际指定并且有效(如果合作伙伴不存在,您将得到路由错误),您将只获得伙伴参数的值...
我使用类似的过程来检测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
事情是我无法使用默认字符串的情况下,我没有合作伙伴。这种方法基于路由中的强制字符串,与我发布的路由一起工作。这个问题似乎是在URL视图助手用来构建URL的反向路线上。 – 2011-03-17 09:20:32
请问这有帮助吗? http://stackoverflow.com/questions/4626048/zend-framework-how-to-map-fully-dynamic-route – 2011-03-17 09:06:52
我读过,但它不能帮助我太多。他的路线是独一无二的。我的地址是“可覆盖的” - 几条路由必须具有相同的名称,以便我可以使用基于路由名称的URL助手构建URL。 – 2011-03-17 09:23:03
:-)他的路线是我的路线=相同的用户。我有一个解决方案,如果别人没有打败我,我会在后面写出来。 – 2011-03-17 09:47:31