Как выполнить запрос доктрины, используя Twig для шаблона в Symfony 2 и 3

Иногда из-за сложных шаблонов проектирования или, возможно, из-за нехватки знаний в области запросов к базам данных вы вынуждены выполнять запросы в представлении. Это до тех пор, пока 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}}

Повеселись

Ссылка на основную публикацию
Adblock
detector