我正在尝试在Symfony2中的自定义用户提供程序中使用Doctrines Entity Manager。
如您所见,我将其作为论据传递:
SnapsavedUserProvider:
class: Snap\ModelBundle\Security\SnapsavedUserProvider
arguments: ["@doctrine.orm.entity_manager"]
在课堂上我做了:
namespace Snap\ModelBundle\Security;
use Snap\RestBundle\Entity\User;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
class SnapsavedUserProvider implements UserProviderInterface {
protected $em;
public function __construct($em) {
$this->setEm($em);
/* IF i var dump $this-getEm() here, i get the EntityManager */
}
public function getEm() {
return $this->em;
}
public function setEm($em) {
$this->em = $em;
}
public function loadUserByUsername($username) {
var_dump($this->getEm());
/* But its NULL here? */
die();
$user = $this->getEm()
->getRepository('SnapRestBundle:User')
->findOneBy(array('username' => $username));
if ($user) {
return $user;
}
throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
}
}
为什么我的EntityManager在loadUserByUsername方法中为NULL?我的意思是,即使使用了新实例,也会注入并设置em,不是吗?
答案 0 :(得分:1)
为什么在通过构造函数注入时使用getter和setter?另外,您缺少界面所需的几种方法。
<?php
namespace Snap\ModelBundle\Security;
use Doctrine\ORM\EntityManager;
use Snap\RestBundle\Entity\User;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
class SnapsavedUserProvider implements UserProviderInterface
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function loadUserByUsername($username)
{
$user = $this->em
->getRepository('SnapRestBundle:User')
->findOneBy(array('username' => $username));
if ($user) {
return $user;
}
throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
}
/**
* Refreshes the user for the account interface.
*
* It is up to the implementation to decide if the user data should be
* totally reloaded (e.g. from the database), or if the UserInterface
* object can just be merged into some internal array of users / identity
* map.
* @param UserInterface $user
*
* @return UserInterface
*
* @throws UnsupportedUserException if the account is not supported
*/
public function refreshUser(UserInterface $user)
{
// TODO: Implement refreshUser() method.
}
/**
* Whether this provider supports the given user class
*
* @param string $class
*
* @return Boolean
*/
public function supportsClass($class)
{
// TODO: Implement supportsClass() method.
}
}