Если вы действительно уверены, что хотите вызывать модель более прямо из вашего шаблона, у меня есть два варианта, которые я вижу:
Либо вы делаете услугу, которая вам нужна, доступной для шаблона, например:
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 }
По сути, эти шаги должны были позволить вам сделать функцию доступной из ветки (при условии, что я все понял;)). Вы можете добавить столько функций, сколько вы хотите, к расширению в одном классе, чтобы избежать необходимости создавать несколько расширений каждый раз, когда вам нужно больше данных, доступных в представлении - хотя я не совсем уверен, для чего я бы пошел, расширение ветки или передача услуги на просмотр.
Надеюсь, это даст вам еще несколько опций, которые могут вписаться в то, как вы планируете проект вашей шаблонной системы:).
Edit: Также просто примечание, чтобы сказать, что я предполагаю, что в схеме вещей вспомогательный объект (расширение ветки для доступа к сервису или передача сервиса) не кажется плохим, так как на самом деле представление обращается к контроллеру с получить некоторые данные, насколько я могу судить. Также я думаю , возможно, есть способ получить доступ к контроллеру, который визуализировал сам шаблон через _controller
, который может быть другим местом для размещения методов.