我试图使用这个提供者类将新的用户数据保存到数据库中,但我总是收到这个错误
"致命错误异常:错误:调用非对象上的成员函数get()"
问题是get('security.encoder_factory')
不知怎么不起作用。我用这个来编码密码。这个代码有没有其他方法或修复方法,这样我就可以在不出错的情况下对密码进行编码?
这是我的提供者类代码:
namespace xxxx'yyyyBundle'Provider;
use HWI'Bundle'OAuthBundle'Security'Core'User'OAuthUserProvider;
use HWI'Bundle'OAuthBundle'OAuth'Response'UserResponseInterface;'
class Provider extends OAuthUserProvider
{
//.....
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
//.....
if ( !count($result) ) {
$user = new User();
$user->setUsername(xxxxx);
$encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
$user->setPassword($encoder->encodePassword(xxxxx, $user->getSalt()));
$user->setStatus(xxxxx);
$user->setFID($facebook_id);
$em = $this->doctrine->getManager();
$em->persist($user);
$id = $em->flush();
} else {
$id = $result[0]['id'];
}
//set id
$this->session->set('id', $id);
//parent:: returned value
return $this->loadUserByUsername($response->getNickname());
}
}
这是一个使用表单进行用户注册的确切原则代码。
看起来您正在使用HWIOAuthBundle
。我不知道这个捆绑包,但粗略地看一下它的来源表明它没有容器意识。。。因此,您的问题是:您正试图在非对象上调用一个方法。
由于您正在扩展OAuthUserProvider
,因此可以将Provider
类设置为服务本身,注入容器(或者更好的是仅注入security.encoder_factory
)。
这没有经过测试,但类似于:
<?php
namespace Foo'BarBundle'Provider;
use Symfony'Component'Security'Core'Encoder'EncoderFactoryInterface;
use HWI'Bundle'OAuthBundle'Security'Core'User'OAuthUserProvider;
use HWI'Bundle'OAuthBundle'OAuth'Response'UserResponseInterface;
class BazProvider extends OAuthUserProvider
{
private $encoder;
public function __construct(EncoderFactoryInterface $encoder)
{
// assign injected object as property
$this->encoder = $encoder;
}
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
$user = new User();
// use injected object
$encoder = $this->encoder->getEncoder($user);
// implement
}
}
在捆绑包的services.yml
中
services:
baz_provider:
class: Foo'BarBundle'Provider'BazProvider
arguments:
- @security.encoder_factory
像任何服务一样,您可以在任何容器感知上下文(如控制器)中调用它,如下所示:
$bazProvider = $this->get('baz_provider');
希望这有帮助:)
编辑
更多阅读请点击此处:http://symfony.com/doc/current/components/dependency_injection/types.html#constructor-注入