2014-01-17 3 views
1

Я получаю эту ошибку «Должен реализовывать UserProviderInterface» при попытке использовать функции входа в symfony. Я ссылаюсь на репозиторий * @ORM \ Entity (repositoryClass = "Login \ LogBundle \ Entity \ Repository \ UserRepository"). У кого-нибудь есть идеи.Symfony 2 должен реализовывать UserProviderInterface

Entity

<?php 
    namespace Login\LogBundle\Entity; 

    use Doctrine\Common\Collections\ArrayCollection; 
    use Doctrine\ORM\Mapping as ORM; 
    use Symfony\Component\Security\Core\User\UserInterface; 
    use Symfony\Component\Security\Core\User\UserProviderInterface; 
    /** 
    * @ORM\Table(name="user") 
    * @ORM\Entity(repositoryClass="Login\LogBundle\Entity\Repository\UserRepository") 
    * @ORM\HasLifecycleCallbacks() 
    */ 
class User implements UserInterface, \Serializable 
{ 
/** 
* @var integer 
*/ 
private $id; 

/** 
* @var string 
*/ 
private $password; 

/** 
* @var string 
*/ 
private $name; 

/** 
* @var string 
*/ 
private $username; 

    /** 
* @ORM\Column(type="string", length=32) 
*/ 
private $salt; 

/** 
* @ORM\Column(type="string", length=60, unique=true) 
*/ 
private $email; 

/** 
* @ORM\Column(name="is_active", type="boolean") 
*/ 
private $isActive; 

/** 
    /** 
* @OneToMany(targetEntity="userapidetails", mappedBy="user") 
*/ 
public $userapidetails; 

public function __construct() 
{ 
    $this->userapidetails = new ArrayCollection(); 
    $this->isActive = true; 
    $this->salt = md5(uniqid(null, true)); 
} 

public function getUserapidetails() { 
    return $this->userapidetails; 
} 

// public function setUserapidetails($userapidetails) { 
// $this->userapi=$userapidetails; 

// return $this; 
// } 
/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set password 
* 
* @param string $password 
* @return User 
*/ 
public function setPassword($password) 
{ 
    $this->password = $password; 

    return $this; 
} 

/** 
* Get password 
* 
* @return string 
*/ 
public function getPassword() 
{ 
    return $this->password; 
} 

/** 
* Set name 
* 
* @param string $name 
* @return User 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

/** 
* Get name 
* 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Set username 
* 
* @param string $username 
* @return User 
*/ 
public function setUsername($username) 
{ 
    $this->username = $username; 

    return $this; 
} 

/** 
* Get username 
* 
* @return string 
*/ 
public function getUsername() 
{ 
    return $this->username; 
} 
/** 
* @var string 
*/ 
private $isactive; 


/** 
* Set email 
* 
* @param string $email 
* @return User 
*/ 
public function setEmail($email) 
{ 
    $this->email = $email; 

    return $this; 
} 

/** 
* Get email 
* 
* @return string 
*/ 
public function getEmail() 
{ 
    return $this->email; 
} 

/** 
* Set salt 
* 
* @param string $salt 
* @return User 
*/ 
public function setSalt($salt) 
{ 
    $this->salt = $salt; 

    return $this; 
} 

/** 
* Get salt 
* 
* @return string 
*/ 
public function getSalt() 
{ 
    return $this->salt; 
} 

/** 
* Set isactive 
* 
* @param string $isactive 
* @return User 
*/ 
public function setIsactive($isactive) 
{ 
    $this->isactive = $isactive; 

    return $this; 
} 

/** 
* Get isactive 
* 
* @return string 
*/ 
public function getIsactive() 
{ 
    return $this->isactive; 
} 




/** 
* @inheritDoc 
*/ 
public function getRoles() 
{ 
    return array('ROLE_USER'); 
} 

/** 
* @inheritDoc 
*/ 
public function eraseCredentials() 
{ 
} 

/** 
* @see \Serializable::serialize() 
*/ 
public function serialize() 
{ 
    return serialize(array(
     $this->id, 
     $this->username, 
     $this->salt, 
     $this->password, 
    )); 
} 

/** 
* @see \Serializable::unserialize() 
*/ 
public function unserialize($serialized) 
{ 
    list (
     $this->id, 
     $this->username, 
     $this->salt, 
     $this->password, 
    ) = unserialize($serialized); 
    } 







    } 

Repository

 // src/Acme/UserBundle/Entity/UserRepository.php 
    namespace Login\LogBundle\Entity; 

    use Doctrine\ORM\EntityRepository; 
    use Symfony\Component\Security\Core\User\UserInterface; 
    use Symfony\Component\Security\Core\User\UserProviderInterface; 
    use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; 
    use Symfony\Component\Security\Core\Exception\UnsupportedUserException; 
    use Doctrine\ORM\NoResultException; 

    class UserRepository extends EntityRepository implements UserProviderInterface 
    { 
    public function loadUserByUsername($username) 
    { 
    $q = $this 
     ->createQueryBuilder('u') 
     ->where('u.username = :username OR u.email = :email') 
     ->setParameter('username', $username) 
     ->setParameter('email', $username) 
     ->getQuery(); 

    try { 
     // The Query::getSingleResult() method throws an exception 
     // if there is no record matching the criteria. 
     $user = $q->getSingleResult(); 
    } catch (NoResultException $e) { 
     $message = sprintf(
'Unable to find an active admin AcmeUserBundle:User object identified by "%s".', 
      $username 
     ); 
     throw new UsernameNotFoundException($message, 0, $e); 
    } 

    return $user; 
} 

public function refreshUser(UserInterface $user) 
{ 
    $class = get_class($user); 
    if (!$this->supportsClass($class)) { 
     throw new UnsupportedUserException(
      sprintf(
       'Instances of "%s" are not supported.', 
       $class 
      ) 
     ); 
    } 

    return $this->find($user->getId()); 
} 

public function supportsClass($class) 
{ 
    return $this->getEntityName() === $class 
     || is_subclass_of($class, $this->getEntityName()); 
} 
} 

ответ

3

Проверьте/Config/security.yml файл приложения с чем-то вроде этого:

# app/config/security.yml 
security: 
    providers: 
     main: 
      entity: 
       class: Acme\UserBundle\Entity\User 
       property: username 

и путь к repositoryClass UserRepository неправильно, возможно, вы имеете в виду это:

@ORM\Entity(repositoryClass="Login\LogBundle\Entity\UserRepository") 

поэтому вы используете пространство имен \Login\LogBundle\Entity\UserRepository.

+0

Исправить пространство имен UserRepository в '@ORM \ Entity (repositoryClass =" Login \ LogBundle \ Entity \ Repository \ UserRepository ")' to '@ORM \ Entity (repositoryClass =" Login \ LogBundle \ Entity \ UserRepository ") ' –

+0

Это исправить вашу проблему? –

+0

да, это то, как они рекомендуют провайдеры: main: entity: {class: LoginLogBundle: User, property: username} – GAV

2

Чтобы загрузить пользователя из Репозитория, вы должны опустить {property: username} из security.yml.

+0

необходимо в symfony> 2.3, но не в symfony <2.2 –

Смежные вопросы