如何在Zend Framework 1.12中设置路由



我的目的是具有:

的产品链接
domain.com/test-product
domain.com/second-test-product

而不是:

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

有关每种产品的信息都在productAction()中获得的ProductsController

它正常工作:

productscontroller:

 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视图中显示:

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

和我的bootstrap.php文件:

<?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);
    }
}

但是,该解决方案具有1个主要缺点:所有其他链接,例如

domain.com/contact
domain.com/about-us

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

问题是,您正在匹配产品控制器中产品操作的所有路线。可能您想继续使用Zend 1中的默认路线,将"联系人"one_answers"大约"与默认控制器中的相应操作匹配。

如果您选中" zend_controller_router_rewrite" function" adddefaultRoutes()"one_answers" route()",则可以看到在任何自定义的一个人之后将检查默认路由。

最简单的解决方案,查看您要问的是要匹配以" -fropoduct"结尾的任何路线:

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

在这种情况下,Nicelink应在相应的示例中进行值"测试"one_answers"第二检验"。

最新更新