我想在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'));
}
}
答案 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 ...
}