4

我确实从这篇文章中得到了答案,但是令牌属性为空,并且用户已正确登录并且路由位于防火墙后面。另外,我在其他服务中注入了 SecurityContext 并且它工作正常。

服务.xml:

<service id="tc.extensions.relation_helper"
 class="TC\CoreBundle\Extensions\RelationHelperExtension">
    <argument type="service" id="security.context" />
    <tag name="twig.extension" />
</service>

我的扩展:

class RelationHelperExtension extends Twig_Extension
{
    /**
     * @var User 
     */
    private $user;

    public function __construct(SecurityContext $securityContext){
        $this->user = $securityContext->getToken()->getUser();
    }
4

2 回答 2

5

正如@Elnur_Abdurrakhimov 所说,我们必须先缓存securityContext,然后getToken()->getUser()在需要时调用。

class RelationHelperExtension extends Twig_Extension
{
    private $context;

    public function __construct(SecurityContext $securityContext){
        $this->context= $securityContext;
    }

    private function getUser(){
            return $this->context->getToken()->getUser();
    }
于 2013-09-12T18:00:15.797 回答
3

要理解这种行为:

Twig_Extension 在 SecurityContext 初始化序列之前实例化 => 此时 SecurityContext 为空

但是如果你将它存储在一个属性中,当你使用你自己的 twig 扩展服务时,你(在大多数情况下)处于请求范围内,并且 SecurityContext 被初始化为具有良好的值:)

于 2013-12-27T11:14:41.260 回答