Skip to content

Commit fe875cd

Browse files
committed
better way to pass class info around
1 parent 10d888d commit fe875cd

File tree

10 files changed

+143
-16
lines changed

10 files changed

+143
-16
lines changed

src/Generator.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1515
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
1616
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
17+
use Symfony\Bundle\MakerBundle\Util\ClassSource\Model\ClassData;
1718
use Symfony\Bundle\MakerBundle\Util\PhpCompatUtil;
1819
use Symfony\Bundle\MakerBundle\Util\TemplateComponentGenerator;
1920

@@ -60,16 +61,13 @@ public function generateClass(string $className, string $templateName, array $va
6061
throw new \LogicException(sprintf('Could not determine where to locate the new class "%s", maybe try with a full namespace like "\\My\\Full\\Namespace\\%s"', $className, Str::getShortClassName($className)));
6162
}
6263

63-
$isEntity = false;
64-
65-
if (\array_key_exists('_is_entity', $variables)) {
66-
$isEntity = true;
64+
if (\array_key_exists('class_data', $variables) && $variables['class_data'] instanceof ClassData) {
65+
$this->templateComponentGenerator->configureClass($variables['class_data']);
6766
}
6867

6968
$variables = array_merge($variables, [
7069
'class_name' => Str::getShortClassName($className),
7170
'namespace' => Str::getNamespace($className),
72-
'final_class' => $this->templateComponentGenerator->getFinalDeclaration($isEntity),
7371
]);
7472

7573
$this->addOperation($targetPath, $templateName, $variables);

src/Maker/MakeVoter.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Bundle\MakerBundle\DependencyBuilder;
1616
use Symfony\Bundle\MakerBundle\Generator;
1717
use Symfony\Bundle\MakerBundle\InputConfiguration;
18+
use Symfony\Bundle\MakerBundle\Util\ClassSource\Model\ClassData;
1819
use Symfony\Component\Console\Command\Command;
1920
use Symfony\Component\Console\Input\InputArgument;
2021
use Symfony\Component\Console\Input\InputInterface;
@@ -46,6 +47,11 @@ public function configureCommand(Command $command, InputConfiguration $inputConf
4647

4748
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void
4849
{
50+
$classMetaData = ClassData::create(
51+
class: sprintf('App\Security\Voter\%sVoter', $input->getArgument('name')),
52+
extendsClass: Voter::class,
53+
);
54+
4955
$voterClassNameDetails = $generator->createClassNameDetails(
5056
$input->getArgument('name'),
5157
'Security\\Voter\\',
@@ -55,7 +61,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
5561
$generator->generateClass(
5662
$voterClassNameDetails->getFullName(),
5763
'security/Voter.tpl.php',
58-
[]
64+
['class_data' => $classMetaData]
5965
);
6066

6167
$generator->writeChanges();

src/Resources/skeleton/security/Voter.tpl.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
77
use Symfony\Component\Security\Core\User\UserInterface;
88

9-
<?= $final_class ?>class <?= $class_name ?> extends Voter
9+
<?= $class_data->getClassDeclaration() ?>
1010
{
1111
public const EDIT = 'POST_EDIT';
1212
public const VIEW = 'POST_VIEW';
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony MakerBundle 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 Symfony\Bundle\MakerBundle\Util\ClassSource\Model;
13+
14+
use Symfony\Bundle\MakerBundle\Str;
15+
16+
/**
17+
* @author Jesse Rushlow <[email protected]>
18+
*
19+
* @internal
20+
*/
21+
final class ClassData
22+
{
23+
private function __construct(
24+
public readonly string $className,
25+
public readonly string $namespace,
26+
public readonly ?string $extends,
27+
public readonly bool $isEntity,
28+
private bool $isFinal = true,
29+
) {
30+
}
31+
32+
public static function create(string $class, ?string $extendsClass = null, bool $isEntity = false): self
33+
{
34+
return new self(
35+
className: Str::getShortClassName($class),
36+
namespace: Str::getNamespace($class),
37+
extends: null === $extendsClass ? null : Str::getShortClassName($extendsClass),
38+
isEntity: $isEntity
39+
);
40+
}
41+
42+
public function getClassDeclaration(): string
43+
{
44+
$extendsDeclaration = '';
45+
46+
if (null !== $this->extends) {
47+
$extendsDeclaration = sprintf(' extends %s', $this->extends);
48+
}
49+
50+
return sprintf('%sclass %s%s',
51+
$this->isFinal ? 'final ' : '',
52+
$this->className,
53+
$extendsDeclaration,
54+
);
55+
}
56+
57+
public function setIsFinal(bool $isFinal): self
58+
{
59+
$this->isFinal = $isFinal;
60+
61+
return $this;
62+
}
63+
}

src/Util/TemplateComponentGenerator.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Bundle\MakerBundle\Util;
1313

14+
use Symfony\Bundle\MakerBundle\Util\ClassSource\Model\ClassData;
15+
1416
/**
1517
* @author Jesse Rushlow <[email protected]>
1618
*
@@ -50,12 +52,12 @@ public function getPropertyType(ClassNameDetails $classNameDetails): ?string
5052
return sprintf('%s ', $classNameDetails->getShortName());
5153
}
5254

53-
public function getFinalDeclaration(bool $forEntity = false): string
55+
public function configureClass(ClassData $classMetadata): ClassData
5456
{
55-
if ($forEntity) {
56-
return $this->generateFinalEntities ? 'final ' : '';
57+
if ($classMetadata->isEntity) {
58+
return $classMetadata->setIsFinal($this->generateFinalEntities);
5759
}
5860

59-
return $this->generateFinalClasses ? 'final ' : '';
61+
return $classMetadata->setIsFinal($this->generateFinalClasses);
6062
}
6163
}

tests/Maker/MakeVoterTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ public function getTestDetails(): \Generator
4141
}),
4242
];
4343

44-
yield 'it_makes_voter_final' => [$this->createMakerTest()
44+
yield 'it_makes_voter_not_final' => [$this->createMakerTest()
4545
->run(function (MakerTestRunner $runner) {
4646
$runner->writeFile(
4747
'config/packages/dev/maker.yaml',
48-
Yaml::dump(['when@dev' => ['maker' => ['generate_final_classes' => true]]])
48+
Yaml::dump(['when@dev' => ['maker' => ['generate_final_classes' => false]]])
4949
);
5050

5151
$runner->runMaker(
@@ -55,7 +55,7 @@ public function getTestDetails(): \Generator
5555
]
5656
);
5757

58-
$expectedVoterPath = \dirname(__DIR__).'/fixtures/make-voter/expected/final_FooBarVoter.php';
58+
$expectedVoterPath = \dirname(__DIR__).'/fixtures/make-voter/expected/not_final_FooBarVoter.php';
5959
$generatedVoter = $runner->getPath('src/Security/Voter/FooBarVoter.php');
6060

6161
self::assertSame(file_get_contents($expectedVoterPath), file_get_contents($generatedVoter));
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony MakerBundle 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 Symfony\Bundle\MakerBundle\Tests\Util\ClassSource;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Bundle\MakerBundle\MakerBundle;
16+
use Symfony\Bundle\MakerBundle\Test\MakerTestKernel;
17+
use Symfony\Bundle\MakerBundle\Util\ClassSource\Model\ClassData;
18+
19+
class ClassDataTest extends TestCase
20+
{
21+
public function testStaticConstructor(): void
22+
{
23+
$meta = ClassData::create(MakerBundle::class);
24+
25+
// Sanity check in case Maker's NS changes
26+
self::assertSame('Symfony\Bundle\MakerBundle\MakerBundle', MakerBundle::class);
27+
28+
self::assertSame('MakerBundle', $meta->className);
29+
self::assertSame('Symfony\Bundle\MakerBundle', $meta->namespace);
30+
}
31+
32+
public function testGetClassDeclaration(): void
33+
{
34+
$meta = ClassData::create(MakerBundle::class);
35+
36+
self::assertSame('final class MakerBundle', $meta->getClassDeclaration());
37+
}
38+
39+
public function testIsFinal(): void
40+
{
41+
$meta = ClassData::create(MakerBundle::class);
42+
43+
// Default - isFinal - true
44+
self::assertSame('final class MakerBundle', $meta->getClassDeclaration());
45+
46+
// Not Final - isFinal - false
47+
$meta->setIsFinal(false);
48+
self::assertSame('class MakerBundle', $meta->getClassDeclaration());
49+
}
50+
51+
public function testGetClassDeclarationWithExtends(): void
52+
{
53+
$meta = ClassData::create(class: MakerBundle::class, extendsClass: MakerTestKernel::class);
54+
55+
self::assertSame('final class MakerBundle extends MakerTestKernel', $meta->getClassDeclaration());
56+
}
57+
}

tests/Util/TemplateComponentGeneratorTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public function routeTrailingNewLineDataProvider(): \Generator
9494
*/
9595
public function testGetFinalClassDeclaration(bool $finalClass, bool $finalEntity, bool $isEntity, string $expectedResult): void
9696
{
97+
$this->markTestIncomplete('We wont need this...');
9798
$generator = new TemplateComponentGenerator($finalClass, $finalEntity);
9899

99100
self::assertSame($expectedResult, $generator->getFinalDeclaration($isEntity));

tests/fixtures/make-voter/expected/FooBarVoter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
77
use Symfony\Component\Security\Core\User\UserInterface;
88

9-
class FooBarVoter extends Voter
9+
final class FooBarVoter extends Voter
1010
{
1111
public const EDIT = 'POST_EDIT';
1212
public const VIEW = 'POST_VIEW';

tests/fixtures/make-voter/expected/final_FooBarVoter.php renamed to tests/fixtures/make-voter/expected/not_final_FooBarVoter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
77
use Symfony\Component\Security\Core\User\UserInterface;
88

9-
final class FooBarVoter extends Voter
9+
class FooBarVoter extends Voter
1010
{
1111
public const EDIT = 'POST_EDIT';
1212
public const VIEW = 'POST_VIEW';

0 commit comments

Comments
 (0)