【问题标题】:symfony2 -How to retrieve data from database globally in every pagesymfony2 - 如何在每个页面中全局从数据库中检索数据
【发布时间】:2014-01-13 15:22:11
【问题描述】:

我想从数据库中的表中检索城市名称,并将它们作为选项放在 'layout.html.twig' 中定义的选择输入(组合框)中。我所有的视图都扩展了“layout.html.twig”,那么如何访问每个页面中的城市名称?

[解决方案]

我无法回应我的主题,我没有太多的声誉,所以我编辑了我的主题

我找到了解决方案,使用"embedding controllers"

  • 首先我创建了一个动作来检索所有城市名称:

    public function listCitiesAction(){
     // retreiving cities
    $entities = $this->getDoctrine()->getRepository("MedAdBundle:City")->findAll();
    
    return $this->render('MedAdBundle:Ville:list_cities.html.twig',
        array('entities' => $entities));
    
    }
    
  • 这个动作渲染 list_cities.html.twig 定义为:

    <select class="form-control">
    {% for entity in entities %}
    <option>{{ entity.name}}</option>
    {% endfor %}
    </select>
    
  • 最后我编辑了我的 layout.html.twig

    <div>
    {{ render(controller('MedAdBundle:City:listCities'))}}
    </div>
    

通过这种方式,我可以在我的应用程序的每个页面中访问城市组合框;)

【问题讨论】:

标签: php symfony doctrine-orm twig


【解决方案1】:

另一个不错的方法是使用render

这允许您从layout.html.twig 中调用控制器

{{ render(controller("AcmeDemoBundle:Helper:citySelector")) }}

您也可以使用ESI 缓存输出。

【讨论】:

  • 老兄,这太棒了。我不知道这个。没有服务,每个控制器上都没有重复代码。太好了。
  • @Sparkup 为什么如果你肯定有胖控制器......另一方面的好处是你可以使用缓存(ESI)或 hinclude(片段的 JavaScript 异步加载)symfony.com/doc/current/book/…
【解决方案2】:

【讨论】:

    【解决方案3】:

    我会按照以下步骤进行:

    • 编写一个表单,托管一个配置为与 Cities 表一起使用的 symfony 实体字段
    • 将此表单定义为 DIC 中的服务
    • 定义一个 twig 扩展,公开一个函数以输出 HTML 表单
    • 使用 layout.html.twig 中由所有其他模板扩展的 twig 函数

    作为一种优化,我会研究如何将 Doctrine 与一些缓存系统(例如 memcached)连接起来,以避免在每次页面加载时访问数据库。

    您可以在此处找到有关实体字段的文档:http://symfony.com/doc/current/reference/forms/types/entity.html

    使用 Symfony 文档了解如何将表单定义为服务以及如何编写自己的 twig 扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2015-02-28
      相关资源
      最近更新 更多