通过Twig扩展中的自定义存储库获取数据

时间:2011-12-09 19:10:20

标签: symfony doctrine-orm twig

我想在symfony 2 webapplication的每一页上显示新的通知。 我被建议使用Twig Extension。我在该扩展中创建了一个函数getFriendRequests,但我不知道在twig扩展中通过我的自定义存储库获取数据是不错的做法:现在它给了我错误,它无法找到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 个答案:

答案 0 :(得分:28)

我认为直接从你的枝条扩展中获取数据并不是那么糟糕。毕竟,如果您不在此处执行此操作,则需要先获取这些记录,然后将它们传递到扩展程序以进行显示。

重点是在存储库中执行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
    }

这是依赖注入的概念。您可以看到我之前回答的有关访问控制器外部服务的另一个问题:here

希望这有帮助。

的问候,
马特

答案 1 :(得分:2)

同样但有mongo:

在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 ... 

}