基于GET参数的zendframework路由

时间:2017-06-22 01:09:09

标签: php zend-framework

我的网站(zendframework 1)中有一个页面,它解析GET参数并从数据库中查询其数据,以便向用户显示。

org.restlet.JSON

我希望我的网址更具人性化

-> my current url : https://example.com/index.php/product/info?id=123

所以我很想解析网址中的GET参数,并从数据库中查询产品名称,以使其在网址中显示为网页名称。

我遇到了一些解决方案,其中一个是通过循环遍历数据库(在bootstrap.php中)并为每个产品添加路线来实现的,但这看起来很乱,(产品可以达到200k或者更多) )。

对我的问题有更好的解决方案吗?提前谢谢

1 个答案:

答案 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个),但允许您重复使用代码。