我想从数据库中获取数据并将其显示在模板中。我通常会在控制器内执行此操作并将该数据作为变量传递,但是我想使用相同的方法获取不同数量的数据,具体取决于调用该方法的模板。我已经看过嵌入控制器,但我只想要数据,而不是呈现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)
位于应用
答案 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 %}
然后在您的template1
和template2
中,您可以硬编码您的值(如果适合),或者分别使用传递给这些模板的值。
{% 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) %}
或者,如果您不想将服务传递给模板以获取所需的数据,那么您可以制作一个枝条扩展程序,您可以阅读:here,here和here。 (注意最后一个链接虽然我认为它包含了很多不必要的步骤,所以我会提供一个更短的版本。
制作一个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 ...)%}