【问题标题】:Database request in routing controller路由控制器中的数据库请求
【发布时间】:2015-08-27 12:25:43
【问题描述】:

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

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 处理程序或控制器。

所以我暂时把数据库请求注释掉了,给$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);

这样就可以按预期工作了:)

【问题讨论】:

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


    【解决方案1】:

    不幸的是,这是 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;
    

    【讨论】:

    • 啊,谢谢你的回答:) 我已经放弃了对 anwser 的希望:) 虽然“暂时覆盖请求”的修复不起作用......我现在正在尝试原始查询解决方案
    • 很好,第一种方法效果很好!谢谢。但是您应该查看第二种方法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2018-08-07
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多