错误:调用成员函数get()


Error: Call to a member function get()

我试图使用这个提供者类将新的用户数据保存到数据库中,但我总是收到这个错误

"致命错误异常:错误:调用非对象上的成员函数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-注入