如何在Zend Framework 1.12中设置路由

时间:2017-03-01 13:22:03

标签: php url zend-framework routing zend-route

我的目标是拥有以下产品链接:

domain.com/test-product
domain.com/second-test-product

而不是:

domain.com/products/product/id/5
domain.com/products/product/id/123

有关每种产品的信息都在ProductsController {。}}中进入。{/ p>

工作正常:

的ProductsController:

productAction()

此方法的链接如下所示:

 public function productAction() {
     $products = new Application_Model_DbTable_Products();
     $nicelink = $this->_getParam('nicelink', 0);
     $this->view->product = $products->fetchRow($products->select()->where('product_nicelink = ?', $nicelink));
     // nicelink is always unique
 }

有关每种产品的信息显示在 for ($i=0; $i < count($this->products); $i++) { echo '<a href="' .$this->baseUrl. '/' .$this->products[$i]->product_nicelink. '">LINK</a>'; } 视图中:

product.phtml

我的Bootstrap.php文件:

<?php echo $this->escape($this->product->product_name); ?>

然而,这个解决方案有一个主要缺点:所有其他链接,如

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

    protected function _initRoutes() {

        $router = Zend_Controller_Front::getInstance()->getRouter();
        include APPLICATION_PATH . "/configs/routes.php";

        //$frontController  = Zend_Controller_Front::getInstance();

        $route = new Zend_Controller_Router_Route_Regex(
            '(.+)',
            array(
                'controller' => 'products',
                'action'     => 'product'
            ),
            array(
                1 => 'nicelink',
            ),
            '%s.html'
        );
        $router->addRoute('profileArchive', $route);
    }
}

不起作用(可能是由于Bootstrap文件)。 如何解决问题,以使另一个链接工作并维护当前的产品链接?

1 个答案:

答案 0 :(得分:1)

问题是您要将所有路径与产品控制器中的产品操作相匹配。您可能希望继续使用zend 1中的默认路由,它将“contact”和“about-us”与默认控制器中的相应操作匹配。

如果选中“Zend_Controller_Router_Rewrite”函数“addDefaultRoutes()”和“route()”,您可以看到在任何自定义路径之后将检查默认路由。

最简单的解决方案,看看你要问的是匹配任何以“-product”结尾的路线:

$route = new Zend_Controller_Router_Route_Regex(
        '(.+)\-product',
        array(
            'controller' => 'products',
            'action'     => 'product'
        ),
        array(
            1 => 'nicelink',
        ),
        '%s.html'
    );

在这种情况下,nicelink应该在相应的示例中使用值“test”和“second-test”。