使用前缀和Zend_Controller_Router_Route

时间:2015-05-05 10:03:39

标签: php zend-framework zend-route

在现有的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的单一路径:

  • 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>

所以添加了产品系列,尽管我的路径的控制器约束不允许这样做。

1 个答案:

答案 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);
    }