我碰到了一个问题,我似乎无法找到一个好的解决方案来使它工作。我必须在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
这样的双斜杠,因为上面路由中设置的反向路由是{{1 }}。我似乎无法找到避免这种反向路由的方法,因为我使用 url view helper 构建我的url,如果没有设置反向路由,我会得到一个异常,说明这一点。
我还需要在没有合作伙伴集的情况下工作的路线,这将是默认方式("%s/proposals.html"
,add-product.html
等。)
答案 0 :(得分: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));
}
视情况改变。在您的控制器中,只有在实际指定且有效时才会获得partner参数的值(如果该伙伴不存在,您将收到路由错误)...
答案 1 :(得分: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