Skip to content

Commit f5d386b

Browse files
committed
Encapsulate user creation with a factory
1 parent cc35898 commit f5d386b

File tree

3 files changed

+57
-24
lines changed

3 files changed

+57
-24
lines changed

src/Command/AddUserCommand.php

+5-14
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use App\Entity\User;
1515
use App\Repository\UserRepository;
16+
use App\User\UserFactory;
1617
use App\Utils\Validator;
1718
use Doctrine\ORM\EntityManagerInterface;
1819
use Symfony\Component\Console\Command\Command;
@@ -22,7 +23,6 @@
2223
use Symfony\Component\Console\Input\InputOption;
2324
use Symfony\Component\Console\Output\OutputInterface;
2425
use Symfony\Component\Console\Style\SymfonyStyle;
25-
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
2626
use Symfony\Component\Stopwatch\Stopwatch;
2727

2828
/**
@@ -56,16 +56,16 @@ class AddUserCommand extends Command
5656
private $io;
5757

5858
private $entityManager;
59-
private $passwordEncoder;
59+
private $userFactory;
6060
private $validator;
6161
private $users;
6262

63-
public function __construct(EntityManagerInterface $em, UserPasswordEncoderInterface $encoder, Validator $validator, UserRepository $users)
63+
public function __construct(EntityManagerInterface $em, UserFactory $userFactory, Validator $validator, UserRepository $users)
6464
{
6565
parent::__construct();
6666

6767
$this->entityManager = $em;
68-
$this->passwordEncoder = $encoder;
68+
$this->userFactory = $userFactory;
6969
$this->validator = $validator;
7070
$this->users = $users;
7171
}
@@ -181,16 +181,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
181181
// make sure to validate the user data is correct
182182
$this->validateUserData($username, $plainPassword, $email, $fullName);
183183

184-
// create the user and encode its password
185-
$user = new User();
186-
$user->setFullName($fullName);
187-
$user->setUsername($username);
188-
$user->setEmail($email);
189-
$user->setRoles([$isAdmin ? 'ROLE_ADMIN' : 'ROLE_USER']);
190-
191-
// See https://symfony.com/doc/current/book/security.html#security-encoding-password
192-
$encodedPassword = $this->passwordEncoder->encodePassword($user, $plainPassword);
193-
$user->setPassword($encodedPassword);
184+
$user = $this->userFactory->createUser($username, $email, $fullName, $plainPassword, [$isAdmin ? 'ROLE_ADMIN' : 'ROLE_USER']);
194185

195186
$this->entityManager->persist($user);
196187
$this->entityManager->flush();

src/DataFixtures/AppFixtures.php

+5-10
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,18 @@
1515
use App\Entity\Post;
1616
use App\Entity\Tag;
1717
use App\Entity\User;
18+
use App\User\UserFactory;
1819
use App\Utils\Slugger;
1920
use Doctrine\Bundle\FixturesBundle\Fixture;
2021
use Doctrine\Common\Persistence\ObjectManager;
21-
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
2222

2323
class AppFixtures extends Fixture
2424
{
25-
private $passwordEncoder;
25+
private $userFactory;
2626

27-
public function __construct(UserPasswordEncoderInterface $passwordEncoder)
27+
public function __construct(UserFactory $userFactory)
2828
{
29-
$this->passwordEncoder = $passwordEncoder;
29+
$this->userFactory = $userFactory;
3030
}
3131

3232
public function load(ObjectManager $manager)
@@ -39,12 +39,7 @@ public function load(ObjectManager $manager)
3939
private function loadUsers(ObjectManager $manager)
4040
{
4141
foreach ($this->getUserData() as [$fullname, $username, $password, $email, $roles]) {
42-
$user = new User();
43-
$user->setFullName($fullname);
44-
$user->setUsername($username);
45-
$user->setPassword($this->passwordEncoder->encodePassword($user, $password));
46-
$user->setEmail($email);
47-
$user->setRoles($roles);
42+
$user = $this->userFactory->createUser($username, $email, $fullname, $password, $roles);
4843

4944
$manager->persist($user);
5045
$this->addReference($username, $user);

src/User/UserFactory.php

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace App\User;
13+
14+
use App\Entity\User;
15+
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
16+
17+
/**
18+
* Creates User instances.
19+
*
20+
* @author Oleg Voronkovich <[email protected]>
21+
*/
22+
class UserFactory
23+
{
24+
/**
25+
* @var UserPasswordEncoderInterface
26+
*/
27+
private $passwordEncoder;
28+
29+
public function __construct(UserPasswordEncoderInterface $passwordEncoder)
30+
{
31+
$this->passwordEncoder = $passwordEncoder;
32+
}
33+
34+
public function createUser(string $username, string $email, string $fullname, string $password, array $roles = ['ROLE_USER']): User
35+
{
36+
$user = new User();
37+
38+
$user->setUsername($username);
39+
$user->setEmail($email);
40+
$user->setFullName($fullname);
41+
// See https://symfony.com/doc/current/book/security.html#security-encoding-password
42+
$user->setPassword($this->passwordEncoder->encodePassword($user, $password));
43+
$user->setRoles($roles);
44+
45+
return $user;
46+
}
47+
}

0 commit comments

Comments
 (0)