Иногда из-за сложных шаблонов проектирования или, возможно, из-за нехватки знаний в области запросов к базам данных вы вынуждены выполнять запросы в представлении. Это до тех пор, пока Symfony 2 не стал проблемой, так как вы могли получить доступ к диспетчеру сущностей из представлений с помощью php, но с введением Twig в Symfony 2 это стало труднее достичь. Помните, что это не очень хорошая практика, поскольку она не соответствует рабочему процессу MVC.
Однако, если вы спешите, это поможет вам:
- Создайте класс, который содержит расширение ветки.
- Напишите расширение.
- Зарегистрируйте расширение в вашем приложении.
- Проверьте свой метод на шаблоне.
Мы собираемся внедрить доктрину в TwigExtension, это позволит вам делать запросы в php-файле и возвращать его в Twig, используя функции или фильтры. В этом случае мы будем использовать только функции. Если вы хотите знать, как создавать фильтры веточек, пожалуйста, прочитайте официальную документацию ветки по следующей ссылке.
Создайте свой класс
Создайте файл с именем TwigExtensions.php
файл где-нибудь в вашем проекте (вам нужно знать пространство имен, так как оно понадобится нам позже). В этом примере мы создадим папку с именем Extensions в /src
папка проекта. Поэтому пространство имен в этом случае будет ourcodeworld\Extensions
, Важно знать пространство имен класса, который вы создаете для регистрации в services.yml
файл.
Напишите расширение
наш TwigExtensions.php
содержимое файла должно выглядеть следующим образом (и имя класса тоже должно совпадать [TwigExtensions]):
doctrine = $doctrine;
}
public function find($id){
$em = $this->doctrine->getManager();
$myRepo = $em->getRepository('ourcodeworldarticlesBundle:Articles');
///
return $myRepo->find($id);
}
public function getName()
{
return 'Twig myCustomName Extensions';
}
}
В предыдущем классе мы зарегистрировали метод с именем find, который будет доступен с помощью twig:
{# Find a register with id 2 #}
{{dump(find(2))}}
Обратите внимание, что вам нужно изменить имя репозитория (изменить работу функции поиска), и вы будете готовы к работе. Имя функции должно быть зарегистрировано как функция в ветке, поэтому вам нужно зарегистрировать его в возвращенном массиве метода getFunctions класса. Конструктор класса ожидает доктрину как параметр (который позволит вам выполнять запросы в этом классе), он будет отправлен на следующем шаге, поэтому не беспокойтесь, если вы не понимаете.
Зарегистрировать услугу
Теперь, когда класс существует, вам нужно зарегистрироваться в файле services.yml, расположенном в /app/config
путь вашего проекта. Как было показано ранее, класс ожидает Doctrine в качестве первого параметра, теперь мы будем использовать yml для его отправки. Зарегистрируйте свой сервис, используя:
services:
twig.extension:
# Register the class (The namespace must match)
class: ourcodeworld\Extensions\TwigExtensions
# Inject doctrine as first parameter
arguments:
doctrine : '@doctrine'
tags:
- { name: twig.extension }
Наконец, не забудьте очистить кеш проекта.
Тест по шаблону
Теперь вы сможете использовать метод find в своих шаблонах. Обратите внимание, что методы являются глобальными и могут быть доступны из всех ваших шаблонов.
Hello, the title of this article is {{find(123).title}}
Повеселись