从Symfony2中的树枝模板中获取数据?

时间:2011-12-14 21:51:14

标签: php symfony twig

我想从数据库中获取数据并将其显示在模板中。我通常会在控制器内执行此操作并将该数据作为变量传递,但是我想使用相同的方法获取不同数量的数据,具体取决于调用该方法的模板。我已经看过嵌入控制器,但我只想要数据,而不是呈现HTML http://symfony.com/doc/2.0/book/templating.html#embedding-controllers

实施例

{# views/template1.html.twig #}

{% for item in FetchDBdata('someParam', 20)  %}
    {{ item.name }}
    {{ item.title }}
{% endfor %}


{# views/template2.html.twig #}

{% for item in FetchDBdata('someOtherParam', 40)  %}
    {{ item.name }}
    {{ item.title }}
{% endfor %}

其中FetchDBdata('someParam', 40)位于应用

的服务类中

3 个答案:

答案 0 :(得分:9)

要添加到我上面的评论中:

您有一个控制器,其中包含获取数据的操作:

<强>的Acme \ SomeBundle \控制器\ DataController.php

/**
 * @Template
 */
public function fetchDataAction($someParam, $quantity) {
    $data = doSomethingWithDatabase();

    return array('data' => $data);
}

<强>的Acme \ SomeBundle \资源\视图\数据\ fetchData.html.twig

{% for item in data %}
    {{ item.name }}
    {{ item.title }}
{% endfor %}

然后在您的template1template2中,您可以硬编码您的值(如果适合),或者分别使用传递给这些模板的值。

{% render 'AcmeSomeBundle:Data:fetchData' with {'someParam': 'something', 'quantity': 20} %}

答案 1 :(得分:1)

如果您确定要从模板中更直接地调用模型,您可以看到两个选项:

您可以为模板提供所需的服务,例如:

public function viewPostsAction() {
    return array('templatingDataService' => $this->get('templating_data_service'));
}

我认为你可以在视图中调用方法:

{% set someData = templatingDataService.someMethod('params', 40) %}

或者,如果您不想将服务传递给模板以获取所需的数据,那么您可以制作一个枝条扩展程序,您可以阅读:hereherehere。 (注意最后一个链接虽然我认为它包含了很多不必要的步骤,所以我会提供一个更短的版本。

制作一个Twig函数,例如FetchDbData:

首先,你需要一个解除这个问题的课程:

<强>的Acme \ SomeBundle \扩展\ TemplateDataExtension.php

class CurrencyExtension extends \Twig_Extension {
    // Read about \Twig_Extension in my second link.

    private $doctrine;

    public function __construct($doctrine) {
        $this->doctrine = $doctrine;
    }

    public function getName() {
        return 'AcmeTemplateDataExtension';
    }

    public function getFunctions() {
        return array('FetchDbData' => new \Twig_Function_Method($this, 'fetchDbData'));
    }

    public function fetchDbData($someParam, $quantity) {
        // Do whatever you want and return it.
    }
}

您应该可以使用FetchDbData($params, $quantity)

直接从模板中调用此内容。

现在您还需要将此注册为您通过services.yml执行的扩展:

parameters:
  template_data_extension.class: Acme\SomeBundle\Extension\TemplateDataExtension

services:
  template_data_extension:
      class:  %template_data_extension.class%
      arguments: [@doctrine]
      tags:
          -  { name: twig.extension }

基本上这些步骤应该允许你从树枝上访问一个函数(假设我把它弄好了;))。你可以在一个类中为扩展添加任意数量的函数,以防止每次需要在视图上访问更多数据时必须进行多次扩展 - 我不确定我会去哪个,twig扩展或者将服务传递给视图。

希望这会为您提供更多可能适合您设想模板系统的选项:)。

编辑:还有一个说明,我想在一个帮助对象(访问服务或传递服务的枝条扩展)的方案中似乎并不坏,因为真正的视图正在回到控制器据我所知,得到一些数据。此外,我认为可能有办法访问控制器,通过_controller将模板呈现给自己,这可能是放置方法的另一个地方。

答案 2 :(得分:1)

一种可能的解决方案是使用twig全局变量。

例如,如果您使用Doctrine2并且您的方法获取数据findSth已在存储库Your\Model中实现,则可以定义:

#config.yml
twig:
    globals:
        em: @doctrine.orm.entity_manager

在你的模板中

  

{%set data = em.getRepository(&#34; Your \ Model&#34;)。findSth(.. params ...)%}