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