Извлечение данных через пользовательский репозиторий в расширении Twig - PullRequest
11 голосов
/ 09 декабря 2011

Я хочу отображать новые уведомления на каждой странице моего веб-приложения Symfony 2.Мне посоветовали использовать расширение Twig для этого.Я создал функцию getFriendRequests в этом расширении, но я не знаю, является ли хорошей практикой получение данных через мой пользовательский репозиторий в расширении ветки: сейчас он выдает ошибку, что не может найти метод getDoctrine,

<?php

namespace Tennisconnect\DashboardBundle\Extension;

class NotificationTwigExtension extends \Twig_Extension
{
    public function getFriendRequests($user)
    {
        $users = $this->getDoctrine()
            ->getRepository('TennisconnectUserBundle:User')
            ->getFriendRequests();
        return count($users);
    }

    public function getName()
    {
        return 'notification';
    }

    public function getFunctions()
    {
        return array(
            'getFriendRequests' => new \Twig_Function_Method($this, 'getFriendRequests'));
    }
}

Ответы [ 2 ]

28 голосов
/ 09 декабря 2011

Я не думаю, что это так плохо - извлекать данные прямо из расширения ветки.В конце концов, если вы не сделаете этого здесь, вам нужно будет сначала извлечь эти записи и затем передать их в расширение для отображения.

Важным моментом является работа с DQL / SQL в репозитории, как вы уже делаете.Это важно для отделения операторов базы данных от другой части вашего проекта.

Проблема, с которой вы столкнулись, заключается в том, что метод getDoctrine не существует в этом классе.Насколько я понимаю, вы взяли этот код у контроллера, который расширяет базовый контроллер FrameworkBundle.Базовый контроллер FrameworkBundle определяет этот метод.

Чтобы преодолеть эту проблему, вам нужно будет ввести правильный сервис в ваш добавочный номер.Это основано на контейнере внедрения зависимости.Вы, безусловно, определили службу для своего расширения ветки, что-то вроде этого определения:

services:
  acme.twig.extension.notification:
    class: Acme\WebsiteBundle\Twig\Extension\NotificationExtension
    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

2 голосов
/ 21 февраля 2012

То же самое, но с монго:

в config.yml

services:
    user.twig.extension:
        class: MiProject\CoreBundle\Twig\Extension\MiFileExtension
        arguments:
          doctrine: "@doctrine.odm.mongodb.document_manager"
        tags:
          -  { name: twig.extension }

и в вашем Twig \ Extensions \ MiFile.php

<?php

namespace MiProject\CoreBundle\Twig\Extension;

use Symfony\Component\HttpKernel\KernelInterface;

class MiFileExtension extends \Twig_Extension
{
    protected $doctrine;

    public function __construct( $doctrine){
        $this->doctrine = $doctrine;
    }
    public function getTransactionsAmount($user_id){
    return $results = $this->doctrine
    ->createQueryBuilder('MiProjectCoreBundle:Transaction')             
    ->hydrate(false)
    ->getQuery()            
    ->count();
    }

    Rest of mi code ... 

}
...