2012-03-21 87 views
5

我试图根据这个link扩展的UserManager在Symfony2中与FOSUserBundle

我的服务就是正确检测延长FOS的的UserManager,但我有一个错误,我不能解析:

ErrorException: Catchable Fatal Error: Argument 1 passed to FOS\UserBundle\Entity\UserManager::__construct() must be an instance of Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface, none given, called in 

MyUserManager:

namespace ChoupsCommerce\UserBundle\Model; 

use FOS\UserBundle\Entity\UserManager; 
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; 

class MyUserManager extends UserManager 
{ 
    public function loadUserByUsername($username) 
    { 
     $user = $this->findUserByUsernameOrEmail($username); 

     if (!$user) { 
      throw new UsernameNotFoundException(sprintf('No user with name "%s" was found.', $username)); 
     } 

     return $user; 
    } 
} 
+0

你有没有发现解决方法?我也有完全一样的问题。 谢谢。 – Creasixtine 2012-04-13 16:50:11

+0

并非如此,我只是停止使用FOS,而只是使用Symfony2登录系统。 – Wifsimster 2012-04-14 11:19:15

+0

你试过我的解决方案吗? – gilden 2012-04-15 22:25:32

回答

4

您需要添加类的构造方法(__construct),并通过必要的参数下到基类:

namespace ChoupsCommerce\UserBundle\Model; 

use Doctrine\ORM\EntityManager; 
use FOS\UserBundle\Entity\UserManager; 
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; 
use FOS\UserBundle\Util\CanonicalizerInterface; 

class MyUserManager extends UserManager 
{ 
    public function __construct(
     EncoderFactoryInterface $encoderFactory, 
     CanonicalizerInterface $usernameCanonicalizer, 
     CanonicalizerInterface $emailCanonicalizer, 
     EntityManager $em, 
     $class 
    ) { 
     parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer, $em, $class); 
    } 
} 
2

对不起,我的英文很差。

可能是您的自定义管理器服务的论点是错误的,因为它说

Argument 1 passed to FOS\UserBundle\Entity\UserManager::__construct() must be an instance of Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface, none given, called in

这里是我的配置:

iep_core.iep_user_manager: 
    class: Iep\CoreBundle\Service\IepUserManager 
    arguments: [@security.encoder_factory, @fos_user.util.username_canonicalizer, @fos_user.util.email_canonicalizer, @fos_user.entity_manager, Iep\CoreBundle\Entity\User] 
18

我有同样的问题,这里是我的解决方案(基本上是前两个答案的组合):

在config.yml中设置服务,不要忘记参数

services: 
    custom_user_manager: 
     class: Acme\UserBundle\Model\CustomUserManager 
     arguments: [@security.encoder_factory, @fos_user.util.username_canonicalizer, @fos_user.util.email_canonicalizer, @fos_user.entity_manager, Acme\UserBundle\Entity\User] 

然后服务连接到FOS user_manager(也config.yml):

fos_user: 
    service: 
     user_manager: custom_user_manager 

在CustomUserManager召回构造法,像gilden说:

class CustomUserManager extends UserManager{ 

    public function __construct(EncoderFactoryInterface $encoderFactory, CanonicalizerInterface $usernameCanonicalizer, CanonicalizerInterface $emailCanonicalizer, ObjectManager $om, $class) 
    { 
     parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer, $om, $class); 
    } 

} 
+10

您可以使用参数值'%fos_user.model.user.class%'而不是硬编码的实体类名称作为最后一个构造函数参数。 – devsheeep 2014-02-17 10:17:53

相关问题