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

时间:2014-04-23 15:37:59

标签: php symfony

我尝试使用此提供程序类将新用户数据保存到数据库,但我总是收到此错误

  

" FatalErrorException:错误:在非对象上调用成员函数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());
    }
}

这个确切的学说代码用于注册表单的用户。

1 个答案:

答案 0 :(得分:0)

看起来您正在使用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-injection