php twig扩展,php – 如何在twig扩展服务中获取当前用户[symfony2.8]

我正在尝试在NotificationExtension.php中获取当前用户.但页面加载速度很慢,我也收到此错误:

Error: Call to a member function getUser() on null

错误说不可能获得当前用户,但我正在登录.

这是我的服务:

notification:

class: Application\Sonata\UserBundle\Twig\NotificationExtension

arguments: ['@doctrine.orm.entity_manager', '@service_container', '@security.context']

tags:

- { name: twig.extension }

NotificationExtension:

namespace Application\Sonata\UserBundle\Twig;

use Doctrine\ORM\EntityManager;

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;

use Twig_Extension;

use Symfony\Component\DependencyInjection\ContainerInterface;

use Symfony\Component\Security\Core\SecurityContext;

use Symfony\Component\Security\Core\Security;

class NotificationExtension extends \Twig_Extension

{

protected $container;

protected $em;

public function __construct(EntityManager $em,ContainerInterface $container, SecurityContext $context)

{

$this->container = $container;

$this->em = $em;

$this->doctrine = $container->get('doctrine');

$this->context = $context;

}

public function getGlobals()

{

$user = $this->container->get('security.context')->getToken()->getUser();

return(array(

'unreadMessagesCount' => $this->em->getRepository('ApplicationSonataUserBundle:Notif')->findBy(

array(

'user' => $user,

'seen' => true

),

array('date' => 'DESC')

)));

}

public function getName()

{

return 'notification';

}

}

加:

服务:

notification:

class: Application\Sonata\UserBundle\Twig\NotificationExtension

arguments: ['@doctrine.orm.entity_manager','@security.token_storage']

tags:

- { name: twig.extension }

获得当前用户:

public function getUser()

{

return $this->tokenStorage->getToken()->getUser();

}

解决方法:

将服务定义为全局Twig变量:

# app/config/config.yml

twig:

# ...

globals:

user_notification: '@app.user_notification'

服务类:

// src/AppBundle/Twig/Globals/UserNotification.php

class UserNotification

{

private $tokenStorage;

// ...

public function __construct(TokenStorageInterface $tokenStorage, ...)

{

$this->tokenStorage = $tokenStorage;

// ...

}

public function getUnreadMessages()

{

if (null === $token = $this->tokenStorage->getToken()) {

return array();

}

$user = $token->getUser();

// $unreadMessages =

return $unreadMessages;

}

}

服务定义:

# app/config/config.yml

services:

app.user_notification:

class: AppBundle\Twig\Globals\UserNotification

arguments: ['@security.token_storage', ...]

最后,对于所有模板,您都可以使用此服务:

# foo.html.twig

{{ user_notification.unreadMessages|length }}

每当在模板中访问全局变量时,将从服务容器请求服务,并且您可以访问该对象.

标签:php,symfony,twig

来源: https://codeday.me/bug/20190828/1755810.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值