Извлечь данные из шаблона ветки в Symfony2?

Я хочу получить данные из базы данных и отобразить их в шаблоне. Обычно я делаю это из контроллера и передаю эти данные как переменную, однако я хочу получать разные объемы данных с использованием того же метода, в зависимости от того, какой шаблон вызывает этот метод. Я посмотрел на встроенные контроллеры, но мне нужны только данные, а не отображаемые 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) будет в классе обслуживания в приложении

Чтобы добавить к моему комментарию выше:

У вас будет контроллер с действием для извлечения ваших данных:

Acme \ SomeBundle \ Controller \ DataController.php

 /** * @Template */ public function fetchDataAction($someParam, $quantity) { $data = doSomethingWithDatabase(); return array('data' => $data); } 

Acme \ SomeBundle \ Resources \ вид \ Data \ fetchData.html.twig

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

то в ваших template1 и template2 вы можете жестко кодировать свои значения, если это подходит, или использовать значения, которые передаются этим шаблонам соответственно.

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

Если вы действительно уверены, что хотите называть модель более непосредственно из своего шаблона, у вас есть два варианта, которые я могу увидеть:

Либо вы делаете услугу, которая вам нужна для шаблона, например:

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

который, я думаю, вы могли бы затем вызвать методы в представлении:

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

В качестве альтернативы, если вы не хотите передавать услугу шаблону для получения требуемых данных, вы можете сделать расширение ветки, о котором вы можете прочитать: здесь , здесь и здесь . (Следите за этой последней ссылкой, хотя я думаю, что она включает в себя множество ненужных шагов, поэтому я дам более короткую версию.

Чтобы создать функцию Twig, такую ​​как FetchDbData:

Сначала вам нужен класс, который делает подъем:

Acme \ SomeBundle \ Extension \ 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 } 

По сути, эти шаги должны были позволить вам сделать функцию доступной из ветки (предположим, что я все понял;)). Вы можете добавить столько функций, сколько хотите для расширения в одном классе, чтобы не было необходимости делать несколько расширений каждый раз, когда вам нужно больше данных, доступных на представлении – я не уверен, к чему бы мне идти, хотя расширение ветки или передача сервиса в представление.

Надеюсь, это даст вам еще несколько вариантов, которые могут вписаться в то, как вы планируете дизайн вашей системы шаблонов :).

Редактирование: также просто примечание, которое, я полагаю, в схеме вещей вспомогательный объект (расширение ветки для доступа к службе или передача службы) не кажется плохим, поскольку на самом деле представление обращается к контроллеру, чтобы получить некоторые данные насколько я могу судить. Также я думаю, что может быть способ получить доступ к контроллеру, который визуализировал шаблон самостоятельно через _controller который может быть другим местом для размещения методов.

Возможным решением является использование глобальных переменных.

В качестве примера, если вы используете Doctrine2 и ваш метод для извлечения данных findSth реализуется в репозитории Your\Model , вы можете определить:

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

И в вашем шаблоне

{% set data = em.getRepository ("Ваша \ Модель"). findSth (.. params …)%}