Skip to content

Commit 7f19dfe

Browse files
committed
[make:security:form-login]
1 parent 951e0d6 commit 7f19dfe

8 files changed

+80
-56
lines changed

phpunit.xml.dist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<env name="SYMFONY_PHPUNIT_VERSION" value="9.6" />
2020
<env name="MAKER_SKIP_MERCURE_TEST" value="false"/>
2121
<env name="MAKER_SKIP_PANTHER_TEST" value="false" />
22+
<env name="MAKER_INTERACTIVE_DEPENDENCIES" value="false" />
2223
<!-- Overrides process timeout when step debugging -->
2324
<!-- <env name="MAKER_PROCESS_TIMEOUT" value="null" /> -->
2425
</php>

src/Command/MakerCommand.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Bundle\MakerBundle\ApplicationAwareMakerInterface;
1515
use Symfony\Bundle\MakerBundle\ConsoleStyle;
16+
use Symfony\Bundle\MakerBundle\Dependency\DependencyManager;
1617
use Symfony\Bundle\MakerBundle\DependencyBuilder;
1718
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
1819
use Symfony\Bundle\MakerBundle\FileManager;
@@ -62,6 +63,13 @@ protected function initialize(InputInterface $input, OutputInterface $output): v
6263
$dependencies = new DependencyBuilder();
6364
$this->maker->configureDependencies($dependencies, $input);
6465

66+
// env is for tests - this way we don't have to add a `y` to every test when a dependency is needed.
67+
$dependencyManager = new DependencyManager($this->io, getenv('MAKER_INTERACTIVE_DEPENDS') ?? true);
68+
69+
$this->maker->configureComposerDependencies($dependencyManager);
70+
71+
$dependencyManager->installRequiredDependencies();
72+
6573
if ($missingPackagesMessage = $dependencies->getMissingPackagesMessage($this->getName())) {
6674
throw new RuntimeCommandException($missingPackagesMessage);
6775
}

src/Dependency/DependencyManager.php

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,56 +31,68 @@ final class DependencyManager
3131
/** @var OptionalClassDependency[] */
3232
private array $optionalClassDependencies = [];
3333

34-
private ConsoleStyle $io;
34+
public function __construct(
35+
private ConsoleStyle $io,
36+
private bool $interactiveMode = true,
37+
) {
38+
}
3539

36-
public function addRequiredDependency(RequiredClassDependency $dependency): self
40+
public function addDependency(RequiredClassDependency|OptionalClassDependency|array $dependency): self
3741
{
38-
$this->requiredClassDependencies[] = $dependency;
42+
$dependencies = [];
3943

40-
return $this;
41-
}
44+
if (!\is_array($dependency)) {
45+
$dependencies[] = $dependency;
46+
}
4247

43-
public function addOptionalDependency(OptionalClassDependency $dependency): self
44-
{
45-
$this->optionalClassDependencies[] = $dependency;
48+
foreach ($dependencies as $dependency) {
49+
if ($dependency instanceof RequiredClassDependency) {
50+
$this->requiredClassDependencies[] = $dependency;
51+
52+
continue;
53+
}
54+
55+
$this->optionalClassDependencies[] = $dependency;
56+
}
4657

4758
return $this;
4859
}
4960

50-
public function installRequiredDependencies(ConsoleStyle $io, ?string $preInstallMessage): self
61+
public function installRequiredDependencies(): self
5162
{
52-
$this->io = $io;
53-
54-
$preInstallMessage ?: $this->io->caution($preInstallMessage);
55-
5663
foreach ($this->requiredClassDependencies as $dependency) {
5764
if (class_exists($dependency->className) || !$this->askToInstallDependency($dependency)) {
5865
continue;
5966
}
6067

68+
$dependency->preInstallMessage ?: $this->io->caution($dependency->preInstallMessage);
69+
6170
$this->runComposer($dependency);
6271
}
6372

6473
return $this;
6574
}
6675

67-
public function installOptionalDependencies(ConsoleStyle $io, ?string $preInstallMessage): self
76+
public function installOptionalDependencies(): self
6877
{
69-
$this->io = $io;
70-
71-
$preInstallMessage ?: $this->io->caution($preInstallMessage);
72-
7378
foreach ($this->optionalClassDependencies as $dependency) {
7479
if (class_exists($dependency->className) || !$this->askToInstallDependency($dependency)) {
7580
continue;
7681
}
7782

83+
$dependency->preInstallMessage ?: $this->io->caution($dependency->preInstallMessage);
84+
7885
$this->runComposer($dependency);
7986
}
8087

8188
return $this;
8289
}
8390

91+
public function installInteractively(): bool
92+
{
93+
return $this->interactiveMode;
94+
}
95+
8496
private function askToInstallDependency(RequiredClassDependency|OptionalClassDependency $dependency): bool
8597
{
8698
return $this->io->confirm(

src/Dependency/Model/AbstractClassDependency.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public function __construct(
2222
public string $className,
2323
public string $composerPackage,
2424
public bool $installAsRequireDev = false,
25+
public ?string $preInstallMessage = null,
2526
) {
2627
}
2728
}

src/Maker/AbstractMaker.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Bundle\MakerBundle\Maker;
1313

1414
use Symfony\Bundle\MakerBundle\ConsoleStyle;
15+
use Symfony\Bundle\MakerBundle\Dependency\DependencyManager;
1516
use Symfony\Bundle\MakerBundle\DependencyBuilder;
1617
use Symfony\Bundle\MakerBundle\MakerInterface;
1718
use Symfony\Component\Console\Command\Command;
@@ -54,4 +55,15 @@ protected function addDependencies(array $dependencies, ?string $message = null)
5455
$message
5556
);
5657
}
58+
59+
public function configureComposerDependencies(DependencyManager $dependencyManager): void
60+
{
61+
// @TODO - method here in abstract prevents BC with signature added to `MakerInterface::class`
62+
}
63+
64+
public function configureDependencies(DependencyBuilder $dependencies)
65+
{
66+
// @TODO - do we deprecate this method in favor of the one above. then remove in 2.x
67+
// @TODO - still have plenty of work todo to determine if thats possible or a good idea...
68+
}
5769
}

src/Maker/MakeTwigComponent.php

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
use Symfony\Bundle\MakerBundle\Dependency\DependencyManager;
1616
use Symfony\Bundle\MakerBundle\Dependency\Model\OptionalClassDependency;
1717
use Symfony\Bundle\MakerBundle\Dependency\Model\RequiredClassDependency;
18-
use Symfony\Bundle\MakerBundle\DependencyBuilder;
1918
use Symfony\Bundle\MakerBundle\Generator;
2019
use Symfony\Bundle\MakerBundle\InputConfiguration;
2120
use Symfony\Bundle\MakerBundle\Str;
@@ -31,10 +30,7 @@
3130
*/
3231
final class MakeTwigComponent extends AbstractMaker
3332
{
34-
public function __construct(
35-
private DependencyManager $dependencyManager = new DependencyManager(),
36-
) {
37-
}
33+
private DependencyManager $dependencyManager;
3834

3935
public static function getCommandName(): string
4036
{
@@ -55,27 +51,27 @@ public function configureCommand(Command $command, InputConfiguration $inputConf
5551
;
5652
}
5753

58-
public function configureDependencies(DependencyBuilder $dependencies): void
54+
public function configureComposerDependencies(DependencyManager $dependencyManager): void
5955
{
60-
$this->dependencyManager
61-
->addRequiredDependency(new RequiredClassDependency(
62-
AsTwigComponent::class,
63-
'symfony/ux-twig-component',
56+
// $this is a hack - we need the manager later in `interact()`
57+
$this->dependencyManager = $dependencyManager;
58+
59+
$dependencyManager
60+
->addDependency(new RequiredClassDependency(
61+
className: AsTwigComponent::class,
62+
composerPackage: 'symfony/ux-twig-component',
63+
preInstallMessage: 'This command requires the Symfony UX Twig Component Package.'
6464
))
65-
->addOptionalDependency(new OptionalClassDependency(
66-
AsLiveComponent::class,
67-
'symfony/ux-live-component',
65+
->addDependency(new OptionalClassDependency(
66+
className: AsLiveComponent::class,
67+
composerPackage: 'symfony/ux-live-component',
68+
preInstallMessage: 'The Symfony UX Live Component is needed to make this a live component.'
6869
))
6970
;
7071
}
7172

7273
public function interact(InputInterface $input, ConsoleStyle $io, Command $command): void
7374
{
74-
$this->dependencyManager->installRequiredDependencies(
75-
io: $io,
76-
preInstallMessage: 'This command requires the Symfony UX Twig Component Package.'
77-
);
78-
7975
if (!$input->getOption('live')) {
8076
$input->setOption('live', $io->confirm('Make this a live component?'));
8177
}
@@ -84,10 +80,8 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
8480
return;
8581
}
8682

87-
$this->dependencyManager->installOptionalDependencies(
88-
io: $io,
89-
preInstallMessage: 'The Symfony UX Live Component is needed to make this a live component.'
90-
);
83+
// @TODO - with the dependencyManager in `Command` -> we can't use it outside of configure dependencies.....
84+
$this->dependencyManager->installOptionalDependencies();
9185
}
9286

9387
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void

src/Maker/Security/MakeFormLogin.php

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
use Doctrine\Bundle\DoctrineBundle\DoctrineBundle;
1515
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1616
use Symfony\Bundle\MakerBundle\ConsoleStyle;
17-
use Symfony\Bundle\MakerBundle\DependencyBuilder;
17+
use Symfony\Bundle\MakerBundle\Dependency\DependencyManager;
18+
use Symfony\Bundle\MakerBundle\Dependency\Model\RequiredClassDependency;
1819
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
1920
use Symfony\Bundle\MakerBundle\FileManager;
2021
use Symfony\Bundle\MakerBundle\Generator;
@@ -77,22 +78,15 @@ public static function getCommandDescription(): string
7778
return 'Generate the code needed for the form_login authenticator';
7879
}
7980

80-
public function configureDependencies(DependencyBuilder $dependencies): void
81+
public function configureComposerDependencies(DependencyManager $dependencyManager): void
8182
{
82-
$dependencies->addClassDependency(
83-
SecurityBundle::class,
84-
'security'
85-
);
86-
87-
$dependencies->addClassDependency(TwigBundle::class, 'twig');
88-
89-
// needed to update the YAML files
90-
$dependencies->addClassDependency(
91-
Yaml::class,
92-
'yaml'
93-
);
94-
95-
$dependencies->addClassDependency(DoctrineBundle::class, 'orm');
83+
$dependencyManager
84+
->addDependency([
85+
new RequiredClassDependency(SecurityBundle::class, 'security'),
86+
new RequiredClassDependency(TwigBundle::class, 'twig'),
87+
new RequiredClassDependency(Yaml::class, 'yaml'),
88+
new RequiredClassDependency(DoctrineBundle::class, 'orm'),
89+
]);
9690
}
9791

9892
public function interact(InputInterface $input, ConsoleStyle $io, Command $command): void

src/MakerInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@
1111

1212
namespace Symfony\Bundle\MakerBundle;
1313

14+
use Symfony\Bundle\MakerBundle\Dependency\DependencyManager;
1415
use Symfony\Component\Console\Command\Command;
1516
use Symfony\Component\Console\Input\InputInterface;
1617

1718
/**
1819
* Interface that all maker commands must implement.
1920
*
2021
* @method static string getCommandDescription()
22+
* @method void configureComposerDependencies(DependencyManager $dependencyManager)
2123
*
2224
* @author Ryan Weaver <ryan@knpuniversity.com>
2325
*/

0 commit comments

Comments
 (0)