diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index ee09e0477..082e894c8 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -15,7 +15,8 @@ return (new PhpCsFixer\Config()) ->setRules(array( - '@PHPUnit75Migration:risky' => true, + '@PHP80Migration' => true, + '@PHPUnit84Migration:risky' => true, '@Symfony' => true, '@Symfony:risky' => true, 'header_comment' => [ @@ -30,6 +31,12 @@ ], 'protected_to_private' => false, 'semicolon_after_instruction' => false, + 'trailing_comma_in_multiline' => [ + 'elements' => [ + 'arrays', + 'parameters' + ], + ] )) ->setRiskyAllowed(true) ->setFinder($finder) diff --git a/src/Doctrine/EntityDetails.php b/src/Doctrine/EntityDetails.php index 22c94ae81..73d07b108 100644 --- a/src/Doctrine/EntityDetails.php +++ b/src/Doctrine/EntityDetails.php @@ -22,7 +22,7 @@ final class EntityDetails { public function __construct( - private ClassMetadata|LegacyClassMetadata $metadata + private ClassMetadata|LegacyClassMetadata $metadata, ) { } diff --git a/src/Doctrine/EntityRegenerator.php b/src/Doctrine/EntityRegenerator.php index 49f5940ed..eec54cc7e 100644 --- a/src/Doctrine/EntityRegenerator.php +++ b/src/Doctrine/EntityRegenerator.php @@ -30,7 +30,7 @@ public function __construct( private FileManager $fileManager, private Generator $generator, private EntityClassGenerator $entityClassGenerator, - private bool $overwrite + private bool $overwrite, ) { } @@ -92,7 +92,7 @@ public function regenerateEntities(string $classOrNamespace): void foreach ($classMetadata->fieldMappings as $fieldName => $mapping) { // skip embedded fields if (false !== strpos($fieldName, '.')) { - list($fieldName, $embeddedFiledName) = explode('.', $fieldName); + [$fieldName, $embeddedFiledName] = explode('.', $fieldName); $operations[$embeddedClasses[$fieldName]]->addEntityField($embeddedFiledName, $mapping); diff --git a/src/Doctrine/EntityRelation.php b/src/Doctrine/EntityRelation.php index ff81f5350..e5ef19ebb 100644 --- a/src/Doctrine/EntityRelation.php +++ b/src/Doctrine/EntityRelation.php @@ -31,7 +31,7 @@ final class EntityRelation public function __construct( private string $type, private string $owningClass, - private string $inverseClass + private string $inverseClass, ) { if (!\in_array($type, self::getValidRelationTypes())) { throw new \Exception(sprintf('Invalid relation type "%s"', $type)); diff --git a/src/FileManager.php b/src/FileManager.php index f2d5299f7..266228550 100644 --- a/src/FileManager.php +++ b/src/FileManager.php @@ -38,7 +38,7 @@ public function __construct( AutoloaderUtil $autoloaderUtil, MakerFileLinkFormatter $makerFileLinkFormatter, string $rootDirectory, - string $twigDefaultPath = null + string $twigDefaultPath = null, ) { // move FileManagerTest stuff // update EntityRegeneratorTest to mock the autoloader diff --git a/src/GeneratorTwigHelper.php b/src/GeneratorTwigHelper.php index eeb6d7c56..47bc58b30 100644 --- a/src/GeneratorTwigHelper.php +++ b/src/GeneratorTwigHelper.php @@ -68,19 +68,19 @@ public function getHeadPrintCode($title): string { if ($this->fileManager->fileExists($this->fileManager->getPathForTemplate('base.html.twig'))) { return << + -$title + $title -HTML; + HTML; } public function getFileLink($path, $text = null, $line = 0): string diff --git a/src/Maker/MakeAuthenticator.php b/src/Maker/MakeAuthenticator.php index 73a5f0ecf..f0c68413d 100644 --- a/src/Maker/MakeAuthenticator.php +++ b/src/Maker/MakeAuthenticator.php @@ -70,7 +70,7 @@ public function __construct( private SecurityConfigUpdater $configUpdater, private Generator $generator, private DoctrineHelper $doctrineHelper, - private SecurityControllerBuilder $securityControllerBuilder + private SecurityControllerBuilder $securityControllerBuilder, ) { } diff --git a/src/Maker/MakeEntity.php b/src/Maker/MakeEntity.php index 9784c029a..585d5967d 100644 --- a/src/Maker/MakeEntity.php +++ b/src/Maker/MakeEntity.php @@ -55,7 +55,7 @@ public function __construct( string $projectDirectory = null, Generator $generator = null, EntityClassGenerator $entityClassGenerator = null, - PhpCompatUtil $phpCompatUtil = null + PhpCompatUtil $phpCompatUtil = null, ) { if (null !== $projectDirectory) { @trigger_error('The $projectDirectory constructor argument is no longer used since 1.41.0', \E_USER_DEPRECATED); diff --git a/src/Maker/MakeRegistrationForm.php b/src/Maker/MakeRegistrationForm.php index f2cac912e..539f9a75e 100644 --- a/src/Maker/MakeRegistrationForm.php +++ b/src/Maker/MakeRegistrationForm.php @@ -86,7 +86,7 @@ public function __construct( private FileManager $fileManager, private FormTypeRenderer $formTypeRenderer, private RouterInterface $router, - private DoctrineHelper $doctrineHelper + private DoctrineHelper $doctrineHelper, ) { } @@ -537,33 +537,33 @@ private function generateFormClass(ClassNameDetails $userClassDetails, Generator 'agreeTerms' => [ 'type' => CheckboxType::class, 'options_code' => << false, - 'constraints' => [ - new IsTrue([ - 'message' => 'You should agree to our terms.', - ]), - ], -EOF + 'mapped' => false, + 'constraints' => [ + new IsTrue([ + 'message' => 'You should agree to our terms.', + ]), + ], + EOF ], 'plainPassword' => [ 'type' => PasswordType::class, 'options_code' => << false, - 'attr' => ['autocomplete' => 'new-password'], - 'constraints' => [ - new NotBlank([ - 'message' => 'Please enter a password', - ]), - new Length([ - 'min' => 6, - 'minMessage' => 'Your password should be at least {{ limit }} characters', - // max length allowed by Symfony for security reasons - 'max' => 4096, - ]), - ], -EOF + // instead of being set onto the object directly, + // this is read and encoded in the controller + 'mapped' => false, + 'attr' => ['autocomplete' => 'new-password'], + 'constraints' => [ + new NotBlank([ + 'message' => 'Please enter a password', + ]), + new Length([ + 'min' => 6, + 'minMessage' => 'Your password should be at least {{ limit }} characters', + // max length allowed by Symfony for security reasons + 'max' => 4096, + ]), + ], + EOF ], ]; diff --git a/src/Maker/MakeResetPassword.php b/src/Maker/MakeResetPassword.php index 5fe6a6d88..265bba2e0 100644 --- a/src/Maker/MakeResetPassword.php +++ b/src/Maker/MakeResetPassword.php @@ -88,7 +88,7 @@ class MakeResetPassword extends AbstractMaker public function __construct( private FileManager $fileManager, private DoctrineHelper $doctrineHelper, - private EntityClassGenerator $entityClassGenerator + private EntityClassGenerator $entityClassGenerator, ) { } @@ -421,10 +421,10 @@ private function generateRequestEntity(Generator $generator, ClassNameDetails $r (new Param('selector'))->setType('string')->getNode(), (new Param('hashedToken'))->setType('string')->getNode(), ], <<<'CODE' -user = $user; -$this->initialize($expiresAt, $selector, $hashedToken); -CODE + user = $user; + $this->initialize($expiresAt, $selector, $hashedToken); + CODE ); $manipulator->addManyToOneRelation((new RelationManyToOne()) @@ -466,9 +466,9 @@ private function generateRequestEntity(Generator $generator, ClassNameDetails $r (new Param('selector'))->setType('string')->getNode(), (new Param('hashedToken'))->setType('string')->getNode(), ], <<<'CODE' -fileManager->dumpFile($pathRequestRepository, $manipulator->getSourceCode()); diff --git a/src/Maker/MakeUser.php b/src/Maker/MakeUser.php index cb0c476d0..8c4426b87 100644 --- a/src/Maker/MakeUser.php +++ b/src/Maker/MakeUser.php @@ -53,7 +53,7 @@ public function __construct( private UserClassBuilder $userClassBuilder, private SecurityConfigUpdater $configUpdater, private EntityClassGenerator $entityClassGenerator, - private DoctrineHelper $doctrineHelper + private DoctrineHelper $doctrineHelper, ) { } diff --git a/src/Renderer/FormTypeRenderer.php b/src/Renderer/FormTypeRenderer.php index 4bbccbdf0..081522d38 100644 --- a/src/Renderer/FormTypeRenderer.php +++ b/src/Renderer/FormTypeRenderer.php @@ -36,7 +36,7 @@ public function render(ClassNameDetails $formClassDetails, array $formFields, Cl $fieldTypeUseStatements = []; $fields = []; foreach ($formFields as $name => $fieldTypeOptions) { - $fieldTypeOptions = $fieldTypeOptions ?? ['type' => null, 'options_code' => null]; + $fieldTypeOptions ??= ['type' => null, 'options_code' => null]; if (isset($fieldTypeOptions['type'])) { $fieldTypeUseStatements[] = $fieldTypeOptions['type']; diff --git a/src/Security/SecurityConfigUpdater.php b/src/Security/SecurityConfigUpdater.php index 4c7c971b9..bc064a7dd 100644 --- a/src/Security/SecurityConfigUpdater.php +++ b/src/Security/SecurityConfigUpdater.php @@ -26,7 +26,7 @@ final class SecurityConfigUpdater private ?YamlSourceManipulator $manipulator; public function __construct( - private ?Logger $ysmLogger = null + private ?Logger $ysmLogger = null, ) { } diff --git a/src/Security/SecurityControllerBuilder.php b/src/Security/SecurityControllerBuilder.php index e5da6d0b0..cadc5993e 100644 --- a/src/Security/SecurityControllerBuilder.php +++ b/src/Security/SecurityControllerBuilder.php @@ -23,7 +23,7 @@ final class SecurityControllerBuilder { public function __construct( - private PhpCompatUtil $phpCompatUtil + private PhpCompatUtil $phpCompatUtil, ) { } @@ -42,32 +42,32 @@ public function addLoginMethod(ClassSourceManipulator $manipulator): void ); $manipulator->addMethodBody($loginMethodBuilder, <<<'CODE' -getUser()) { -// return $this->redirectToRoute('target_path'); -// } -CODE + getUser()) { + // return $this->redirectToRoute('target_path'); + // } + CODE ); $loginMethodBuilder->addStmt($manipulator->createMethodLevelBlankLine()); $manipulator->addMethodBody($loginMethodBuilder, <<<'CODE' -getLastAuthenticationError(); -// last username entered by the user -$lastUsername = $authenticationUtils->getLastUsername(); -CODE + getLastAuthenticationError(); + // last username entered by the user + $lastUsername = $authenticationUtils->getLastUsername(); + CODE ); $loginMethodBuilder->addStmt($manipulator->createMethodLevelBlankLine()); $manipulator->addMethodBody($loginMethodBuilder, <<<'CODE' -render( - 'security/login.html.twig', - [ - 'last_username' => $lastUsername, - 'error' => $error, - ] -); -CODE + render( + 'security/login.html.twig', + [ + 'last_username' => $lastUsername, + 'error' => $error, + ] + ); + CODE ); $manipulator->addMethodBuilder($loginMethodBuilder); } @@ -80,9 +80,9 @@ public function addLogoutMethod(ClassSourceManipulator $manipulator): void $manipulator->addUseStatementIfNecessary(Route::class); $manipulator->addMethodBody($logoutMethodBuilder, <<<'CODE' -addMethodBuilder($logoutMethodBuilder); } diff --git a/src/Test/MakerTestCase.php b/src/Test/MakerTestCase.php index 3b550a735..2ad468f43 100644 --- a/src/Test/MakerTestCase.php +++ b/src/Test/MakerTestCase.php @@ -106,7 +106,7 @@ private function getMakerInstance(string $makerClass): MakerInterface } // a cheap way to guess the service id - $serviceId = $serviceId ?? sprintf('maker.maker.%s', Str::asSnakeCase((new \ReflectionClass($makerClass))->getShortName())); + $serviceId ??= sprintf('maker.maker.%s', Str::asSnakeCase((new \ReflectionClass($makerClass))->getShortName())); return $this->kernel->getContainer()->get($serviceId); } diff --git a/src/Util/AutoloaderUtil.php b/src/Util/AutoloaderUtil.php index b006e91b1..a81bc7711 100644 --- a/src/Util/AutoloaderUtil.php +++ b/src/Util/AutoloaderUtil.php @@ -21,7 +21,7 @@ class AutoloaderUtil { public function __construct( - private ComposerAutoloaderFinder $autoloaderFinder + private ComposerAutoloaderFinder $autoloaderFinder, ) { } diff --git a/src/Util/ClassDetails.php b/src/Util/ClassDetails.php index 8f4b3352c..684014a69 100644 --- a/src/Util/ClassDetails.php +++ b/src/Util/ClassDetails.php @@ -17,7 +17,7 @@ final class ClassDetails { public function __construct( - private string $fullClassName + private string $fullClassName, ) { } diff --git a/src/Util/ClassNameDetails.php b/src/Util/ClassNameDetails.php index e1df74ee0..3372c74d1 100644 --- a/src/Util/ClassNameDetails.php +++ b/src/Util/ClassNameDetails.php @@ -18,7 +18,7 @@ final class ClassNameDetails public function __construct( private string $fullClassName, private string $namespacePrefix, - private ?string $suffix = null + private ?string $suffix = null, ) { $this->namespacePrefix = trim($namespacePrefix, '\\'); } diff --git a/src/Util/ClassNameValue.php b/src/Util/ClassNameValue.php index 71e7a42ff..14d463e17 100644 --- a/src/Util/ClassNameValue.php +++ b/src/Util/ClassNameValue.php @@ -20,7 +20,7 @@ final class ClassNameValue { public function __construct( private string $typeHint, - private string $fullClassName + private string $fullClassName, ) { } diff --git a/src/Util/UseStatementGenerator.php b/src/Util/UseStatementGenerator.php index a5d297851..2523cca18 100644 --- a/src/Util/UseStatementGenerator.php +++ b/src/Util/UseStatementGenerator.php @@ -29,7 +29,7 @@ final class UseStatementGenerator implements \Stringable * @param string[]|array $classesToBeImported */ public function __construct( - private array $classesToBeImported + private array $classesToBeImported, ) { } diff --git a/src/Util/YamlSourceManipulator.php b/src/Util/YamlSourceManipulator.php index f1049ecd7..235cc0f1e 100644 --- a/src/Util/YamlSourceManipulator.php +++ b/src/Util/YamlSourceManipulator.php @@ -49,7 +49,7 @@ class YamlSourceManipulator private $arrayTypeForDepths = []; public function __construct( - private string $contents + private string $contents, ) { $this->currentData = Yaml::parse($contents); @@ -966,7 +966,7 @@ private function log(string $message, $includeContent = false) } $context = [ - 'key' => isset($this->currentPath[$this->depth]) ? $this->currentPath[$this->depth] : 'n/a', + 'key' => $this->currentPath[$this->depth] ?? 'n/a', 'depth' => $this->depth, 'position' => $this->currentPosition, 'indentation' => $this->indentationForDepths[$this->depth], diff --git a/tests/DependencyBuilderTest.php b/tests/DependencyBuilderTest.php index 39568b576..20637f315 100644 --- a/tests/DependencyBuilderTest.php +++ b/tests/DependencyBuilderTest.php @@ -98,30 +98,30 @@ public function getMissingPackagesMessageTests() ['bar-package'], [], << [ ['bar-package', 'other-package'], [], << [ [], ['bar-package', 'other-package'], <<writeFile( 'config/packages/messenger.yaml', <<setType('string')->getNode(), ], <<<'CODE' -someParam = $someParam; -CODE + someParam = $someParam; + CODE ); $this->assertSame($expectedSource, $manipulator->getSourceCode()); @@ -779,9 +779,9 @@ public function testAddMethodWithBody() ); $manipulator->addMethodBody($methodBuilder, <<<'CODE' - $param]); -CODE + $param]); + CODE ); $manipulator->addMethodBuilder($methodBuilder); $manipulator->addUseStatementIfNecessary('Symfony\\Component\\HttpFoundation\\JsonResponse'); @@ -807,118 +807,118 @@ public function getTestsForAddAnnotationToClass() { yield 'no_doc_block' => [ << [ << [ << [ <<setType('object')->getNode(), (new Param('someStringParam'))->setType('string')->getNode(), ], <<<'CODE' -someObjectParam = $someObjectParam; -$this->someMethod($someStringParam); -CODE + someObjectParam = $someObjectParam; + $this->someMethod($someStringParam); + CODE ); $this->assertSame($expectedSource, $manipulator->getSourceCode()); @@ -1013,10 +1013,10 @@ public function testAddConstructorInClassContainsPropsAndMethods() (new Param('someObjectParam'))->setType('object')->getNode(), (new Param('someStringParam'))->setType('string')->getNode(), ], <<<'CODE' -someObjectParam = $someObjectParam; -$this->someMethod($someStringParam); -CODE + someObjectParam = $someObjectParam; + $this->someMethod($someStringParam); + CODE ); $this->assertSame($expectedSource, $manipulator->getSourceCode()); @@ -1033,10 +1033,10 @@ public function testAddConstructorInClassContainsOnlyConstants() (new Param('someObjectParam'))->setType('object')->getNode(), (new Param('someStringParam'))->setType('string')->getNode(), ], <<<'CODE' -someObjectParam = $someObjectParam; -$this->someMethod($someStringParam); -CODE + someObjectParam = $someObjectParam; + $this->someMethod($someStringParam); + CODE ); $this->assertSame($expectedSource, $manipulator->getSourceCode()); @@ -1055,10 +1055,10 @@ public function testAddConstructorInClassContainsConstructor() (new Param('someObjectParam'))->setType('object')->getNode(), (new Param('someStringParam'))->setType('string')->getNode(), ], <<<'CODE' -someObjectParam = $someObjectParam; -$this->someMethod($someStringParam); -CODE + someObjectParam = $someObjectParam; + $this->someMethod($someStringParam); + CODE ); } } diff --git a/tests/Util/ComposeFileManipulatorTest.php b/tests/Util/ComposeFileManipulatorTest.php index 7c369828e..786d0b59a 100644 --- a/tests/Util/ComposeFileManipulatorTest.php +++ b/tests/Util/ComposeFileManipulatorTest.php @@ -40,10 +40,10 @@ public function testGetComposeDataReturnsEmptyComposeFileOnEmpty(): void public function testServiceExists(): void { $composeFile = <<< 'EOT' -version: '3.7' -services: - database: -EOT; + version: '3.7' + services: + database: + EOT; $manipulator = new ComposeFileManipulator($composeFile); self::assertTrue($manipulator->serviceExists('database')); @@ -70,11 +70,11 @@ public function testAddDockerService(): void public function testRemoveDockerService(): void { $composeFile = <<< 'EOT' -version: '3.7' -services: - database: - rabbitmq: -EOT; + version: '3.7' + services: + database: + rabbitmq: + EOT; $manipulator = new ComposeFileManipulator($composeFile); $manipulator->removeDockerService('rabbitmq'); @@ -91,11 +91,11 @@ public function testRemoveDockerService(): void public function testExposePorts(): void { $composeFile = <<< 'EOT' -version: '3.7' -services: - rabbitmq: - am: 'I next?' -EOT; + version: '3.7' + services: + rabbitmq: + am: 'I next?' + EOT; $manipulator = new ComposeFileManipulator($composeFile); $manipulator->exposePorts('rabbitmq', ['15672']); @@ -117,11 +117,11 @@ public function testExposePorts(): void public function testAddVolume(): void { $composeFile = <<< 'EOT' -version: '3.7' -services: - php: - yes: 'this looks fun' -EOT; + version: '3.7' + services: + php: + yes: 'this looks fun' + EOT; $manipulator = new ComposeFileManipulator($composeFile); $manipulator->addVolume('php', '/var/htdocs', '/var'); @@ -154,9 +154,9 @@ public function testCheckComposeFileVersion(): void public function testCheckComposeFileVersionThrowsExceptionWithMissingVersion(): void { $composeFile = <<< 'EOT' -services: - [] -EOT; + services: + [] + EOT; $this->expectException(RuntimeCommandException::class); $this->expectExceptionMessage('docker-compose.yaml file version is not set.'); diff --git a/tests/Util/UseStatementGeneratorTest.php b/tests/Util/UseStatementGeneratorTest.php index ea06be0d4..10a46aec6 100644 --- a/tests/Util/UseStatementGeneratorTest.php +++ b/tests/Util/UseStatementGeneratorTest.php @@ -30,12 +30,12 @@ public function testUseStatements(): void ]); $expected = <<< 'EOT' -use App\Controller\SomeController; -use Symfony\Bundle\MakerBundle\Test\MakerTestCase; -use Symfony\Bundle\MakerBundle\Util\Sorter; -use SymfonyCasts\Bundle\VerifyEmail\VerifyEmailHelper; + use App\Controller\SomeController; + use Symfony\Bundle\MakerBundle\Test\MakerTestCase; + use Symfony\Bundle\MakerBundle\Util\Sorter; + use SymfonyCasts\Bundle\VerifyEmail\VerifyEmailHelper; -EOT; + EOT; self::assertSame($expected, (string) $unsorted); } @@ -57,20 +57,20 @@ public function testComplexStatements(): void ]); $expected = <<< 'EOT' -use App\Entity\User; -use App\Form\RegistrationFormType; -use App\Security\EmailVerifier; -use Doctrine\ORM\EntityManagerInterface; -use Symfony\Bridge\Twig\Mime\TemplatedEmail; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Mime\Address; -use Symfony\Component\Routing\Annotation\Route; -use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; -use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface; + use App\Entity\User; + use App\Form\RegistrationFormType; + use App\Security\EmailVerifier; + use Doctrine\ORM\EntityManagerInterface; + use Symfony\Bridge\Twig\Mime\TemplatedEmail; + use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; + use Symfony\Component\HttpFoundation\Request; + use Symfony\Component\HttpFoundation\Response; + use Symfony\Component\Mime\Address; + use Symfony\Component\Routing\Annotation\Route; + use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; + use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface; -EOT; + EOT; self::assertSame($expected, (string) $unsorted); } @@ -83,11 +83,11 @@ public function testUseStatementsWithAliases(): void ]); $expected = <<< 'EOT' -use ApiPlatform\Core\Annotation\ApiResource; -use Doctrine\ORM\Mapping as ORM; -use Symfony\UX\Turbo\Attribute\Broadcast; + use ApiPlatform\Core\Annotation\ApiResource; + use Doctrine\ORM\Mapping as ORM; + use Symfony\UX\Turbo\Attribute\Broadcast; -EOT; + EOT; self::assertSame($expected, (string) $unsorted); } } diff --git a/tests/Util/YamlSourceManipulatorTest.php b/tests/Util/YamlSourceManipulatorTest.php index 56024236d..45d60f184 100644 --- a/tests/Util/YamlSourceManipulatorTest.php +++ b/tests/Util/YamlSourceManipulatorTest.php @@ -56,7 +56,7 @@ private function getYamlDataTests() ->name('*.test'); foreach ($finder as $file) { - list($source, $changeCode, $expected) = explode('===', $file->getContents()); + [$source, $changeCode, $expected] = explode('===', $file->getContents()); // Multiline string ends with an \n $source = substr_replace($source, '', (\strlen($source) - 1));