diff --git a/features/installer/install_command.feature b/features/installer/install_command.feature
index d84257235f2..0c2f55a6479 100644
--- a/features/installer/install_command.feature
+++ b/features/installer/install_command.feature
@@ -12,9 +12,9 @@ Feature: Sylius Install Feature
Scenario: Trying to register administrator account without email
Given I do not provide an email
When I run Sylius CLI installer
- Then I should see output "E-mail: This value should not be blank"
+ Then I should see output "This value should not be blank"
Scenario: Trying to register administrator account with an incorrect email
Given I do not provide a correct email
When I run Sylius CLI installer
- Then I should see output "E-mail: This value is not a valid email address."
+ Then I should see output "This value is not a valid email address."
diff --git a/features/installer/load_sample_data_command.feature b/features/installer/load_sample_data_command.feature
index 03b5857ecf4..8c37488846b 100644
--- a/features/installer/load_sample_data_command.feature
+++ b/features/installer/load_sample_data_command.feature
@@ -5,6 +5,6 @@ Feature: Load sample data feature
I want to run a command that loads sample data
Scenario: Running install sample data command
- Given I run Sylius Install Load Sample Data command
+ When I run Sylius Install Load Sample Data command
And I confirm loading sample data
Then the command should finish successfully
diff --git a/src/Sylius/Behat/Context/Cli/InstallerContext.php b/src/Sylius/Behat/Context/Cli/InstallerContext.php
index ce37339ac9b..3cda26aef9e 100644
--- a/src/Sylius/Behat/Context/Cli/InstallerContext.php
+++ b/src/Sylius/Behat/Context/Cli/InstallerContext.php
@@ -58,6 +58,7 @@ final class InstallerContext implements Context
private $inputChoices = [
'currency' => 'USD',
'e-mail' => 'test@email.com',
+ 'username' => 'test',
'password' => 'pswd',
'confirmation' => 'pswd',
];
@@ -141,6 +142,7 @@ public function iDoNotProvideCorrectEmail()
public function iProvideFullAdministratorData()
{
$this->inputChoices['e-mail'] = 'test@admin.com';
+ $this->inputChoices['username'] = 'test';
$this->inputChoices['password'] = 'pswd1$';
$this->inputChoices['confirmation'] = $this->inputChoices['password'];
}
diff --git a/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php b/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php
index 41424bf6393..210db62aca0 100644
--- a/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php
+++ b/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php
@@ -14,6 +14,7 @@
namespace Sylius\Bundle\CoreBundle\Command;
use Sylius\Component\Core\Model\AdminUserInterface;
+use Sylius\Component\User\Repository\UserRepositoryInterface;
use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@@ -91,32 +92,27 @@ protected function setupAdministratorUser(InputInterface $input, OutputInterface
*
* @return AdminUserInterface
*/
- private function configureNewUser(AdminUserInterface $user, InputInterface $input, OutputInterface $output): AdminUserInterface
- {
- $userRepository = $this->get('sylius.repository.admin_user');
+ private function configureNewUser(
+ AdminUserInterface $user,
+ InputInterface $input,
+ OutputInterface $output
+ ): AdminUserInterface {
+ /** @var UserRepositoryInterface $userRepository */
+ $userRepository = $this->getAdminUserRepository();
if ($input->getOption('no-interaction')) {
Assert::null($userRepository->findOneByEmail('sylius@example.com'));
$user->setEmail('sylius@example.com');
+ $user->setUsername('sylius');
$user->setPlainPassword('sylius');
return $user;
}
- $questionHelper = $this->getHelper('question');
-
- do {
- $question = $this->createEmailQuestion($output);
- $email = $questionHelper->ask($input, $output, $question);
- $exists = null !== $userRepository->findOneByEmail($email);
-
- if ($exists) {
- $output->writeln('E-Mail is already in use!');
- }
- } while ($exists);
-
+ $email = $this->getAdministratorEmail($input, $output);
$user->setEmail($email);
+ $user->setUsername($this->getAdministratorUsername($input, $output, $email));
$user->setPlainPassword($this->getAdministratorPassword($input, $output));
return $user;
@@ -129,7 +125,7 @@ private function configureNewUser(AdminUserInterface $user, InputInterface $inpu
*/
private function createEmailQuestion(OutputInterface $output): Question
{
- return (new Question('E-mail:'))
+ return (new Question('E-mail: '))
->setValidator(function ($value) use ($output) {
/** @var ConstraintViolationListInterface $errors */
$errors = $this->get('validator')->validate((string) $value, [new Email(), new NotBlank()]);
@@ -143,6 +139,59 @@ private function createEmailQuestion(OutputInterface $output): Question
;
}
+ /**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ *
+ * @return string
+ */
+ private function getAdministratorEmail(InputInterface $input, OutputInterface $output): string
+ {
+ /** @var QuestionHelper $questionHelper */
+ $questionHelper = $this->getHelper('question');
+ /** @var UserRepositoryInterface $userRepository */
+ $userRepository = $this->getAdminUserRepository();
+
+ do {
+ $question = $this->createEmailQuestion($output);
+ $email = $questionHelper->ask($input, $output, $question);
+ $exists = null !== $userRepository->findOneByEmail($email);
+
+ if ($exists) {
+ $output->writeln('E-Mail is already in use!');
+ }
+ } while ($exists);
+
+ return $email;
+ }
+
+ /**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ * @param string $email
+ *
+ * @return string
+ */
+ private function getAdministratorUsername(InputInterface $input, OutputInterface $output, string $email): string
+ {
+ /** @var QuestionHelper $questionHelper */
+ $questionHelper = $this->getHelper('question');
+ /** @var UserRepositoryInterface $userRepository */
+ $userRepository = $this->getAdminUserRepository();
+
+ do {
+ $question = new Question('Username (press enter to use email): ', $email);
+ $username = $questionHelper->ask($input, $output, $question);
+ $exists = null !== $userRepository->findOneBy(['username' => $username]);
+
+ if ($exists) {
+ $output->writeln('Username is already in use!');
+ }
+ } while ($exists);
+
+ return $username;
+ }
+
/**
* @param InputInterface $input
* @param OutputInterface $output
@@ -205,4 +254,12 @@ private function createPasswordQuestion(string $message, \Closure $validator): Q
->setHiddenFallback(false)
;
}
+
+ /**
+ * @return UserRepositoryInterface
+ */
+ private function getAdminUserRepository(): UserRepositoryInterface
+ {
+ return $this->get('sylius.repository.admin_user');
+ }
}