路由控制器中的数据库请求

时间:2015-08-27 12:25:43

标签: php symfony routing bolt-cms symfony-http-foundation

我正在建立一个包含类别和产品的网站。类别和产品都是内容类型。类别不能是分类法类型,因为网站的编辑者必须更改类别的数据。为了解决这个问题,我创建了一个自定义路由:

products:
    path: /{catslug}/{slug}
    defaults: { _controller: 'Bolt\Controllers\Frontend::record', contenttypeslug: 'products' }
    requirements:
         catslug: 'Bolt\Controllers\Routing::getAnyCategorieRequirement'

我在Routing.php中添加了一个函数(我稍后将其移动到扩展名):

public function getAnyCategorieRequirement()
{        
    $slugs = array();
    foreach($this->app['storage']->getContent("categories") as $cat){
        $slugs[] = $cat['slug'];
    }
    return implode("|", $slugs);
}

但后来我碰到了一个问题:

  

在请求范围之外访问请求服务。尝试将该调用移动到before handler或controller。

所以我暂时注释掉了数据库请求,并在$ slugs中添加了一个默认的slug:

public function getAnyCategorieRequirement()
{        
    $slugs = array();
    $slugs[] = "hollandse-kazen";
    return implode("|", $slugs);
}

这样一切都按预期工作。现在我的问题是:我如何在路由控制器中执行此数据库请求,或者是否有解决此问题的方法?

Ross Riley的第一个解决方案对我有用:

    $slugs = array();
    //Do complicated request because of [url to stackoverflow]
    $stmt = $this->app['db']->query('SELECT slug FROM bolt_categories');
    while($cat = $stmt->fetch()){
        $slugs[] = $cat['slug'];
    }
    return implode("|", $slugs);

这种方式可以按预期工作:)

1 个答案:

答案 0 :(得分:0)

不幸的是,这是Bolt的getContent()方法的一个已知问题,它依赖于请求循环,如下所述:https://github.com/bolt/bolt/issues/2129

围绕它的两种方法是使用$ app [' db']对db进行原始查询,而不是使用getContent()

另一种是暂时覆盖$ app ['请求']以允许其工作。像这样的东西可以完成这项工作。

use Symfony\Component\HttpFoundation\Request;
.....
$oldRequest = $app['request'];
$app['request'] = Request::createFromGlobals();
....
<do database call here>
....
$app['request'] = $oldRequest;