Symfony3服务和令牌存储

Dav*_*vid 5 service symfony

我尝试设置服务以从我的数据库中检索实体.我的services.yml看起来像这样:

app.twig_global_extension:
    class: AppBundle\Twig\GlobalExtension
    arguments: [ "@doctrine.orm.entity_manager", "@security.token_storage" ]
    tags:
        - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)

我的GlobalExtension是这样的:

<?php
namespace AppBundle\Twig;

class GlobalExtension extends \Twig_Extension
{
    protected $em;
    protected $token_storage;

    public function __construct(\Doctrine\ORM\EntityManager $em, \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage $token_storage)
    {
        $this->em = $em;
        $this->token_storage = $token_storage;
    }


    public function getGlobals()
    {
        return [
            'userdata' => $this->em->getRepository('AppBundle:userdata')->findOneBy(['internalid' => $this->token_storage->getToken()->getUser()->getId()]),
        ];
    }

    public function getName()
    {
        return 'app_global_extension';
    }
}
Run Code Online (Sandbox Code Playgroud)

它检索正确的实体,但我的Profiler在页面加载完成后抛出错误:

BadMethodCallException in GlobalExtension.php line 18:
Call to a member function getUser() on a non-object (null)
Run Code Online (Sandbox Code Playgroud)

首先,在这种情况下问题是什么?

$this->token_storage->getToken()->getUser()->getId()
Run Code Online (Sandbox Code Playgroud)

它检索正确的ID,但在Profiler中抛出一个错误?

\ Doctrine\ORM\EntityManager,因为这被标记为Deprecated?

Wou*_*r J 4

“在非对象(空)上调用成员函数 getUser() ”正如您的代码所示$this->token_storage->getToken()->getUser()->getId()$this->token_storage->getToken()必须使null此错误成立。查看此方法的 PHPdoc,您会看到:

/**
 * Returns the current security token.
 *
 * @return TokenInterface|null A TokenInterface instance or null if no authentication information is available
 */
public function getToken();
Run Code Online (Sandbox Code Playgroud)

换句话说,探查器 URL 可能不在防火墙后面,因此getToken()没有身份验证信息并且为空。

在您的函数中,请确保考虑到这种情况,例如,当令牌不可用时返回 null。