如何在 Zend Framework 1.12 中设置路由
How to set routing in Zend Framework 1.12
我的目标是让产品 link 像:
domain.com/test-product
domain.com/second-test-product
而不是:
domain.com/products/product/id/5
domain.com/products/product/id/123
有关每个产品的信息在 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
}
此方法的 link 如下所示:
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 个主要缺点:所有其他 link,例如
domain.com/contact
domain.com/about-us
不工作(可能是由于 Bootstrap 文件)。
如何解决该问题以使另一个 link 正常工作并维护当前产品 link?
问题是您正在将所有路由匹配到产品控制器中的产品操作。可能您想继续使用 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"。
我的目标是让产品 link 像:
domain.com/test-product
domain.com/second-test-product
而不是:
domain.com/products/product/id/5
domain.com/products/product/id/123
有关每个产品的信息在 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
}
此方法的 link 如下所示:
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 个主要缺点:所有其他 link,例如
domain.com/contact
domain.com/about-us
不工作(可能是由于 Bootstrap 文件)。 如何解决该问题以使另一个 link 正常工作并维护当前产品 link?
问题是您正在将所有路由匹配到产品控制器中的产品操作。可能您想继续使用 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"。