路由控制器中的数据库请求
Database request in routing controller
我正在制作一个包含类别和产品的网站。类别和产品都是内容类型。类别不能是分类法类型,因为网站的编辑必须更改类别的数据。为了解决这个问题,我创建了一个自定义路由:
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);
}
但是我遇到了一个问题:
Accessed request service outside of request scope. Try moving that call to a before handler or 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 Whosebug]
$stmt = $this->app['db']->query('SELECT slug FROM bolt_categories');
while($cat = $stmt->fetch()){
$slugs[] = $cat['slug'];
}
return implode("|", $slugs);
这样就可以正常工作了:)
不幸的是,这是 Bolt 的 getContent() 方法的一个已知问题,它取决于是否处于请求循环中,如此处所述:https://github.com/bolt/bolt/issues/2129
解决它的两种方法是使用 $app['db'] 对数据库进行原始查询,而不是使用 getContent()
另一种是暂时覆盖$app['request']让它工作。这样的事情就可以完成工作。
use Symfony\Component\HttpFoundation\Request;
.....
$oldRequest = $app['request'];
$app['request'] = Request::createFromGlobals();
....
<do database call here>
....
$app['request'] = $oldRequest;
我正在制作一个包含类别和产品的网站。类别和产品都是内容类型。类别不能是分类法类型,因为网站的编辑必须更改类别的数据。为了解决这个问题,我创建了一个自定义路由:
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);
}
但是我遇到了一个问题:
Accessed request service outside of request scope. Try moving that call to a before handler or 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 Whosebug]
$stmt = $this->app['db']->query('SELECT slug FROM bolt_categories');
while($cat = $stmt->fetch()){
$slugs[] = $cat['slug'];
}
return implode("|", $slugs);
这样就可以正常工作了:)
不幸的是,这是 Bolt 的 getContent() 方法的一个已知问题,它取决于是否处于请求循环中,如此处所述:https://github.com/bolt/bolt/issues/2129
解决它的两种方法是使用 $app['db'] 对数据库进行原始查询,而不是使用 getContent()
另一种是暂时覆盖$app['request']让它工作。这样的事情就可以完成工作。
use Symfony\Component\HttpFoundation\Request;
.....
$oldRequest = $app['request'];
$app['request'] = Request::createFromGlobals();
....
<do database call here>
....
$app['request'] = $oldRequest;