Skip to content

Commit

Permalink
Refactoring EntityUserProvider::__construct() to not do work, cause c…
Browse files Browse the repository at this point in the history
…ache warm error
  • Loading branch information
weaverryan authored and stof committed Dec 2, 2015
1 parent d9b8d0c commit 44a2861
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 23 deletions.
72 changes: 50 additions & 22 deletions src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php
Expand Up @@ -27,22 +27,17 @@
*/
class EntityUserProvider implements UserProviderInterface
{
private $registry;
private $managerName;
private $classOrAlias;
private $class;
private $repository;
private $property;
private $metadata;

public function __construct(ManagerRegistry $registry, $class, $property = null, $managerName = null)
public function __construct(ManagerRegistry $registry, $classOrAlias, $property = null, $managerName = null)
{
$em = $registry->getManager($managerName);
$this->class = $class;
$this->metadata = $em->getClassMetadata($class);

if (false !== strpos($this->class, ':')) {
$this->class = $this->metadata->getName();
}

$this->repository = $em->getRepository($class);
$this->registry = $registry;
$this->managerName = $managerName;
$this->classOrAlias = $classOrAlias;
$this->property = $property;
}

Expand All @@ -51,14 +46,15 @@ public function __construct(ManagerRegistry $registry, $class, $property = null,
*/
public function loadUserByUsername($username)
{
$repository = $this->getRepository();
if (null !== $this->property) {
$user = $this->repository->findOneBy(array($this->property => $username));
$user = $repository->findOneBy(array($this->property => $username));
} else {
if (!$this->repository instanceof UserProviderInterface) {
throw new \InvalidArgumentException(sprintf('The Doctrine repository "%s" must implement UserProviderInterface.', get_class($this->repository)));
if (!$repository instanceof UserProviderInterface) {
throw new \InvalidArgumentException(sprintf('The Doctrine repository "%s" must implement UserProviderInterface.', get_class($repository)));
}

$user = $this->repository->loadUserByUsername($username);
$user = $repository->loadUserByUsername($username);
}

if (null === $user) {
Expand All @@ -73,26 +69,28 @@ public function loadUserByUsername($username)
*/
public function refreshUser(UserInterface $user)
{
if (!$user instanceof $this->class) {
$class = $this->getClass();
if (!$user instanceof $class) {
throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
}

if ($this->repository instanceof UserProviderInterface) {
$refreshedUser = $this->repository->refreshUser($user);
$repository = $this->getRepository();
if ($repository instanceof UserProviderInterface) {
$refreshedUser = $repository->refreshUser($user);
} else {
// The user must be reloaded via the primary key as all other data
// might have changed without proper persistence in the database.
// That's the case when the user has been changed by a form with
// validation errors.
if (!$id = $this->metadata->getIdentifierValues($user)) {
if (!$id = $this->getClassMetadata()->getIdentifierValues($user)) {
throw new \InvalidArgumentException('You cannot refresh a user '.
'from the EntityUserProvider that does not contain an identifier. '.
'The user object has to be serialized with its own identifier '.
'mapped by Doctrine.'
);
}

$refreshedUser = $this->repository->find($id);
$refreshedUser = $repository->find($id);
if (null === $refreshedUser) {
throw new UsernameNotFoundException(sprintf('User with id %s not found', json_encode($id)));
}
Expand All @@ -106,6 +104,36 @@ public function refreshUser(UserInterface $user)
*/
public function supportsClass($class)
{
return $class === $this->class || is_subclass_of($class, $this->class);
return $class === $this->getClass() || is_subclass_of($class, $this->getClass());
}

private function getObjectManager()
{
return $this->registry->getManager($this->managerName);
}

private function getRepository()
{
return $this->getObjectManager()->getRepository($this->classOrAlias);
}

private function getClass()
{
if (null === $this->class) {
$class = $this->classOrAlias;

if (false !== strpos($class, ':')) {
$class = $this->getClassMetadata()->getName();
}

$this->class = $class;
}

return $this->class;
}

private function getClassMetadata()
{
return $this->getObjectManager()->getClassMetadata($this->classOrAlias);
}
}
Expand Up @@ -92,7 +92,7 @@ public function testSupportProxy()
private function getManager($em, $name = null)
{
$manager = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');
$manager->expects($this->once())
$manager->expects($this->any())
->method('getManager')
->with($this->equalTo($name))
->will($this->returnValue($em));
Expand Down

0 comments on commit 44a2861

Please sign in to comment.