我的网站(zendframework 1)中有一个页面,它解析GET参数并从数据库中查询其数据,以便向用户显示。
org.restlet.JSON
我希望我的网址更具人性化
-> my current url : https://example.com/index.php/product/info?id=123
所以我很想解析网址中的GET参数,并从数据库中查询产品名称,以使其在网址中显示为网页名称。
我遇到了一些解决方案,其中一个是通过循环遍历数据库(在bootstrap.php中)并为每个产品添加路线来实现的,但这看起来很乱,(产品可以达到200k或者更多) )。
对我的问题有更好的解决方案吗?提前谢谢
答案 0 :(得分:0)
所以基本上,ZF1提供了一个默认路由,该路由通向url中名称的控制器/动作。
您可以在application/Bootstrap.php
文件中添加一个函数来添加自定义路由:
/**
* This method loads URL routes defined in /application/configs/routes.ini
* @return Zend_Router
*/
protected function _initRouter() {
$this->bootstrap('frontController');
$front = $this->getResource('frontController');
$router = $front->getRouter();
$router->addRoute(
'user',
new Zend_Controller_Router_Route('product/:slug', array(
'controller' => 'product',
'action' => 'details',
), array(
'slug' => '[A-Za-z0-9-]+',
))
);
return $router;
}
你走了!
如Chris所述,您需要更改控制器代码以处理请求。另一种解决方案是使用额外的操作。
final class ProductController
{
public function infoAction()
{
$product = $table->find($this->_param('id'));
$this->view->product = $product;
}
public function detailsAction()
{
$product = $table->fetch(['slug' => $this->_param('slug')]);
$this->view->product = $product;
$this->render('info');
}
}
现在,假设您在infoAction
中进行了大量处理,您可以选择前进:
final class ProductController
{
public function infoAction()
{
$product = $table->find($this->_param('id'));
$this->view->product = $product;
}
public function detailsAction()
{
$product = $table->fetch(['slug' => $this->_param('slug')]);
$this->forward('info', 'product', [
'id' => $product->id,
]);
}
}
效率较低(2个请求而不是1个),但允许您重复使用代码。