在另一个类中使用$ this-> get('security.context') - > getToken() - > getUser()

时间:2014-01-20 06:12:07

标签: symfony

我想在一个类(FOSUBUserProvider)中获得这样的当前用户ID

$this->get('security.context')->getToken()->getUser()

但它说

FatalErrorException: Error: Call to undefined method Acme\UserBundle\Security\Core\User\FOSUBUserProvider::get() in 

我想我应该在这堂课中注入一些东西,

我该怎么做?

我的构造是这样的,我怎么能在这里添加security.context?

class FOSUBUserProvider extends BaseClass
{

    public function __construct(UserManagerInterface $userManager, array $properties)
    {
        $this->userManager = $userManager;
        $this->properties  = $properties;
    }

1 个答案:

答案 0 :(得分:2)

<强>原因

FOSUBUserProvider没有注入容器,因此$this->get()无效($this->container->get()的别名)

<强>解决方案

如果您想要访问security.context服务那么最简单,我认为最优雅的方式是在您的捆绑中扩展FOSUBUserProvider

这样做可以创建扩展的新类:HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider

请注意array $properties必须是最后一个参数,我在它们之间注入了$ securityContext。这是必要的,因为我们覆盖服务定义,稍后它将附加参数。 (这里没有相关的高级主题)

namespace KP\MainBundle\Security\Core\User;

use FOS\UserBundle\Model\UserManagerInterface;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseFOSUBUserProvider;
use Symfony\Component\Security\Core\SecurityContext;


class FOSUBUserProvider extends BaseFOSUBUserProvider
{
    /**
     * @var SecurityContext
     */
    protected $securityContext;

    /**
     * Constructor.
     *
     * @param UserManagerInterface $userManager     FOSUB user provider.
     * @param SecurityContext      $securityContext Security context
     * @param array                $properties      Property mapping.
     */
    public function __construct(UserManagerInterface $userManager, $securityContext, array $properties)
    {
        $this->userManager = $userManager;
        $this->securityContext = $securityContext;
        $this->properties  = $properties;
    }
}

覆盖HWIOAuthBundle使用的类名称添加到服务文件中

parameter:
    hwi_oauth.user.provider.fosub_bridge.class: KP\MainBundle\Security\Core\User\FOSUBUserProvider

services:
    hwi_oauth.user.provider.fosub_bridge.def:
        class: %hwi_oauth.user.provider.fosub_bridge.class%
        abstract: true
        arguments:
            - @fos_user.user_manager
            - @security.context

重要提示

您的捆绑包必须在HWIOAuthBundle之后注册,否则覆盖服务将无效。

# app/AppKernel.php
$bundles = array(
        ...
        new FOS\UserBundle\FOSUserBundle(),
        new HWI\Bundle\OAuthBundle\HWIOAuthBundle(),
        new KP\MainBundle\KPMainBundle(),
        ...

现在,您可以使用简单的SecurityContext

访问$this->securityContext服务