2012-03-21 36 views
5

traté de extender el UserManager de FOS de acuerdo con esta linkUserManager en Symfony2 con FOSUserBundle

Mi servicio se detecta correctamente, pero tengo un error que no puedo resolver:

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

¿Ha encontrado una solución? Tengo exactamente el mismo problema. Gracias. – Creasixtine

+0

En realidad, no dejo de usar FOS y simplemente uso el sistema de inicio de sesión Symfony2. – Wifsimster

+0

¿Has probado mi solución? – gilden

Respuesta

4

es necesario agregar el método constructor (__construct) y pasar los argumentos necesarios a la clase base:

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

Lo siento mi Inglés es pobre.

puede haber argumentos de su servicio gestor de encargo es incorrecto porque dice

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

Aquí es mi config:

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

he tenido el mismo problema, aquí es mi solución (básicamente una combinación de las dos primeras respuestas):

Servicio de configuración en config.yml, no olvide los argumentos

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] 

A continuación, conecte el servicio a los FOS user_manager (también en config.yml):

fos_user: 
    service: 
     user_manager: custom_user_manager 

En el CustomUserManager recuerdan el constructo método, como Gilden dijo:

class CustomUserManager extends UserManager{ 

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

} 
+10

Puede usar el valor del parámetro '% fos_user.model.user.class%' en lugar del nombre de la clase de la entidad codificada como el último argumento constructor. – devsheeep

Cuestiones relacionadas