Ответ 1
Я не думаю, что это так плохо, чтобы получать ваши данные непосредственно из вашего расширения ветки. В конце концов, если вы этого не сделаете, вам нужно будет забрать эти записи до этого, а затем передать их в расширение для отображения в любом случае.
Важным моментом является использование данных DQL/SQL в репозитории, как вы уже делали. Это важно, чтобы отделить заявления базы данных от другой части вашего проекта.
У вас проблема в том, что метод getDoctrine
не существует в этом классе. Насколько я понимаю, вы взяли этот код из контроллера, который расширяет базовый контроллер FrameworkBundle
. Базовый контроллер FrameworkBundle
определяет этот метод.
Чтобы решить эту проблему, вам нужно будет ввести правильную услугу в расширение. Это основано на контейнере инъекции зависимостей. Вы определенно определили службу для расширения ветки, что-то вроде этого определения:
services:
acme.twig.extension.notification:
class: Acme\WebsiteBundle\Twig\Extension\NotificationExtension
tags:
- { name: twig.extension }
Теперь вам нужно ввести нужные вам зависимости:
services:
acme.twig.extension.notification:
class: Acme\WebsiteBundle\Twig\Extension\NotificationExtension
arguments:
doctrine: "@doctrine"
tags:
- { name: twig.extension }
И затем в расширении вы определяете конструктор, который получает зависимость доктрины:
use Symfony\Bridge\Doctrine\RegistryInterface;
class NotificationTwigExtension extends \Twig_Extension
{
protected $doctrine;
public function __construct(RegistryInterface $doctrine)
{
$this->doctrine = $doctrine;
}
// Now you can do $this->doctrine->getRepository('TennisconnectUserBundle:User')
// Rest of twig extension
}
Это концепция инъекции зависимостей. Вы можете увидеть еще один вопрос, который я когда-то отвечал о доступе к службам вне контроллера: здесь
Надеюсь, что это поможет.
С уважением,
Matt