在现有的Zend Framework网站上,只有很少的控制器,没有模块,我需要在默认路由中添加一些前缀。
例如,我目前有:
/products
/products/id/1
/training
/commonpage
我想添加一个产品线级别,而不是在x模块中复制我的控制器(我只是在我的控制器中使用_getParam
请求正确的产品系列。)
所以我的新路径将是:
/line1/products
/line1/products/id/1
/line2/training
/commonpage
到目前为止我尝试的是这条路线(位于我的Bootstrap文件中):
protected function _initRoutes()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute('productLineRoute', new Zend_Controller_Router_Route(
':line/:controller/:action',
array('module' => 'default'),
array('line' => '(' . implode('|', Zend_Registry::getInstance()->constants->lines) . ')')
));
}
但没有任何成功(它给了我一个404)。 如何在这些条件下构建匹配所有uri的单一路径:
好的,我设法非常接近我尝试使用此代码:
protected function _initConstants()
{
$registry = Zend_Registry::getInstance();
$registry->constants = new Zend_Config( $this->getApplication()->getOption('constants') );
$uri = ltrim($_SERVER['REQUEST_URI'], '/');
$product_line = substr($uri, 0, strpos($uri, '/'));
if(!empty($product_line) && in_array($product_line, Zend_Registry::getInstance()->constants->lines->toArray()) &&
$product_line != Zend_Registry::getInstance()->constants->lines->get(0)) {
$registry->product_line = $product_line;
} elseif(!isset($registry->gamme)) {
$registry->product_line = Zend_Registry::getInstance()->constants->lines->get(0);
}
}
protected function _initRoutes()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$registry = Zend_Registry::getInstance();
$router->addRoute('productLineRoute', new Zend_Controller_Router_Route(
':line/:controller/:action/*',
array(
'module' => 'default', 'action' => 'index',
'line' => (isset($registry->product_line)) ? $registry->product_line : Zend_Registry::getInstance()->constants->lines->get(0)
),
array(
'line' => '(' . implode('|', Zend_Registry::getInstance()->constants->lines->toArray()) . ')',
'controller' => '(' . implode('|', array('products', 'training')) . ')'
)
));
}
有了这个,我可以访问/line1/products
而不是/line1/commonpage
,这就是我想要的 - 所以控制器约束工作得很好。正如您所看到的,我在Zend Registry中添加了产品系列名称,因此当我在模板中使用URL View Helper时会保存它(这样我就不必编辑所有模板来添加产品系列参数了我的助手打电话。)
我现在遇到的问题是关于这个帮助器:似乎我的控制器约束被忽略了。当我在模板中执行此操作时:
<a href="<?php echo $this->url(array('controller'=> 'commonpage', 'action'=>'index'),null, true) ; ?>">My link</a>
我最终得到了这个:
<a href="/line1/commonpage">My link</a>
所以添加了产品系列,尽管我的路径的控制器约束不允许这样做。
答案 0 :(得分:1)
好的,我找到了一个解决方案:我更改了URL Helper,在其中添加了控制器约束。如果控制器不匹配&#34;产品线控制器&#34;数组,它强制assemble
使用默认路由(不完美,但它适用于我):
public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true, $default = false)
{
$router = Zend_Controller_Front::getInstance()->getRouter();
if(isset($urlOptions['controller']) && !in_array($urlOptions['controller'], array('products', 'training'))) {
$name = 'default';
}
return $router->assemble($urlOptions, $name, $reset, $encode);
}