我想在一个类(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;
}
答案 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
服务