2014-01-17 184 views
1

当试图使用symfony登录功能时,出现此错误'必须实现UserProviderInterface' 。我引用存储库* @ORM \ Entity(repositoryClass =“Login \ LogBundle \ Entity \ Repository \ UserRepository”)。有没有人有任何想法。Symfony 2必须实现UserProviderInterface

实体

<?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); 
    } 







    } 

 // 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

检查应用程序/配置/ 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

将'@ORM \ Entity(repositoryClass =“Login \ LogBundle \ Entity \ Repository \ UserRepository”)中的'UserRepository'命名空间修复为'@ORM \ Entity(repositoryClass =“Login \ LogBundle \ Entity \ UserRepository”) ' –

+0

这是否解决了您的问题? –

+0

是的,谢谢,这是他们如何推荐提供商: 主要: 实体:{类:LoginLogBundle:用户,财产:用户名} – GAV

2

要从Repository中加载用户,您应该从security.yml中省略{property:username}。

+0

它是必要的在symfony> 2.3,但不是在symfony <2.2 –

相关问题