diff --git a/composer.json b/composer.json index 1b8f6bf3..dab044fb 100644 --- a/composer.json +++ b/composer.json @@ -12,11 +12,11 @@ ], "require": { "php": ">=8.0", - "doctrine/common": "^3.2", - "doctrine/persistence": "^2.2|^3.0", - "doctrine/dbal": "^3.2", - "doctrine/orm": "^2.10", - "doctrine/doctrine-bundle": "^2.5", + "doctrine/common": "^3.3", + "doctrine/persistence": "^2.5|^3.0", + "doctrine/dbal": "^3.3", + "doctrine/orm": "^2.12", + "doctrine/doctrine-bundle": "^2.6", "symfony/cache": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/http-kernel": "^5.4|^6.0", @@ -34,19 +34,17 @@ "psr/log": "^1.1", "doctrine/annotations": "^1.13", "php-parallel-lint/php-parallel-lint": "^1.3", - "phpstan/phpstan": "^1.6.3", + "phpstan/phpstan": "^1.7.10", "phpunit/phpunit": "^9.5", - "rector/rector": "^0.12.10", - "symplify/easy-coding-standard": "^10.0", - "symplify/phpstan-extensions": "^10.0", - "phpstan/phpstan-doctrine": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "symplify/package-builder": "^10.0", - "symplify/phpstan-rules": "^10.0", - "symplify/config-transformer": "^10.0", - "symplify/amnesia": "^10.0", + "rector/rector": "^0.13.4", + "symplify/easy-coding-standard": "^10.2.9", + "symplify/phpstan-extensions": "^10.2.9", + "phpstan/phpstan-doctrine": "^1.3", + "phpstan/phpstan-phpunit": "^1.1", + "symplify/package-builder": "^10.2.9", + "symplify/phpstan-rules": "^10.2.9", "phpstan/extension-installer": "^1.1", - "symplify/easy-ci": "^10.0" + "symplify/easy-ci": "^10.2.9" }, "autoload": { "psr-4": { diff --git a/ecs.php b/ecs.php index 09ff20f5..2ac15c85 100644 --- a/ecs.php +++ b/ecs.php @@ -2,11 +2,9 @@ declare(strict_types=1); -use PhpCsFixer\Fixer\Comment\HeaderCommentFixer; use PhpCsFixer\Fixer\Import\OrderedImportsFixer; use PhpCsFixer\Fixer\Operator\UnaryOperatorSpacesFixer; use PhpCsFixer\Fixer\Phpdoc\GeneralPhpdocAnnotationRemoveFixer; -use PhpCsFixer\Fixer\PhpUnit\PhpUnitStrictFixer; use Symplify\EasyCodingStandard\Config\ECSConfig; use Symplify\EasyCodingStandard\ValueObject\Set\SetList; @@ -24,19 +22,11 @@ $ecsConfig->skip([ UnaryOperatorSpacesFixer::class, - PhpUnitStrictFixer::class => [__DIR__ . '/tests/ORM/Timestampable/TimestampableTest.php'], OrderedImportsFixer::class => [ __DIR__ . '/tests/Fixtures/Entity/AbstractTimestampableMappedSuperclassEntity.php', ], __DIR__ . '/src/Bundle/DoctrineBehaviorsBundle.php', __DIR__ . '/src/DoctrineBehaviorsBundle.php', - - // broken on PHP 8.1 - \PhpCsFixer\Fixer\FunctionNotation\FunctionTypehintSpaceFixer::class, - ]); - - $ecsConfig->ruleWithConfiguration(HeaderCommentFixer::class, [ - 'header' => '', ]); $ecsConfig->ruleWithConfiguration(GeneralPhpdocAnnotationRemoveFixer::class, [ diff --git a/phpstan.neon b/phpstan.neon index 81e7e87d..c8f2daf1 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -5,9 +5,7 @@ includes: - vendor/symplify/phpstan-rules/config/array-rules.neon - vendor/symplify/phpstan-rules/config/doctrine-rules.neon - vendor/symplify/phpstan-rules/config/regex-rules.neon - - vendor/symplify/phpstan-rules/config/services-rules.neon - vendor/symplify/phpstan-rules/config/forbidden-static-rules.neon - - vendor/symplify/phpstan-rules/config/string-to-constant-rules.neon - vendor/symplify/phpstan-rules/config/test-rules.neon parameters: diff --git a/src/EventSubscriber/TranslatableEventSubscriber.php b/src/EventSubscriber/TranslatableEventSubscriber.php index 4f05e1c1..5611c8f6 100644 --- a/src/EventSubscriber/TranslatableEventSubscriber.php +++ b/src/EventSubscriber/TranslatableEventSubscriber.php @@ -28,8 +28,8 @@ final class TranslatableEventSubscriber implements EventSubscriberInterface public function __construct( private LocaleProviderInterface $localeProvider, - string $translatableFetchMode, - string $translationFetchMode + string $translatableFetchMode, + string $translationFetchMode ) { $this->translatableFetchMode = $this->convertFetchString($translatableFetchMode); $this->translationFetchMode = $this->convertFetchString($translationFetchMode); diff --git a/tests/DatabaseLoader.php b/tests/DatabaseLoader.php index 8718336d..58417bde 100644 --- a/tests/DatabaseLoader.php +++ b/tests/DatabaseLoader.php @@ -34,7 +34,7 @@ public function reload(): void } /** - * @param string[] $entityClasses + * @param class-string[] $entityClasses */ public function reloadEntityClasses(array $entityClasses): void { diff --git a/tests/ORM/Translatable/TranslatableInheritanceTest.php b/tests/ORM/Translatable/TranslatableInheritanceTest.php index 1f3cd9bc..0459686b 100644 --- a/tests/ORM/Translatable/TranslatableInheritanceTest.php +++ b/tests/ORM/Translatable/TranslatableInheritanceTest.php @@ -7,6 +7,7 @@ use Doctrine\Persistence\ObjectRepository; use Knp\DoctrineBehaviors\Tests\AbstractBehaviorTestCase; use Knp\DoctrineBehaviors\Tests\Fixtures\Entity\Translatable\ExtendedTranslatableEntity; +use Knp\DoctrineBehaviors\Tests\Fixtures\Entity\Translatable\ExtendedTranslatableEntityTranslation; final class TranslatableInheritanceTest extends AbstractBehaviorTestCase { @@ -25,20 +26,22 @@ protected function setUp(): void public function testShouldPersistTranslationsWithInheritance(): void { $entity = new ExtendedTranslatableEntity(); - $entity->translate('fr') - ->setTitle('fabuleux'); - $entity->translate('fr') - ->setExtendedTitle('fabuleux'); - - $entity->translate('en') - ->setTitle('awesome'); - $entity->translate('en') - ->setExtendedTitle('awesome'); - - $entity->translate('ru') - ->setTitle('удивительный'); - $entity->translate('ru') - ->setExtendedTitle('удивительный'); + + /** @var ExtendedTranslatableEntityTranslation $frenchEntity */ + $frenchEntity = $entity->translate('fr'); + $frenchEntity->setTitle('fabuleux'); + $frenchEntity->setExtendedTitle('fabuleux'); + + /** @var ExtendedTranslatableEntityTranslation $englishEntity */ + $englishEntity = $entity->translate('en'); + $englishEntity->setTitle('awesome'); + $englishEntity->setExtendedTitle('awesome'); + + /** @var ExtendedTranslatableEntityTranslation $russianEntity */ + $russianEntity = $entity->translate('ru'); + $russianEntity->setTitle('удивительный'); + $russianEntity->setExtendedTitle('удивительный'); + $entity->mergeNewTranslations(); $this->entityManager->persist($entity); @@ -51,13 +54,19 @@ public function testShouldPersistTranslationsWithInheritance(): void /** @var ExtendedTranslatableEntity $entity */ $entity = $this->objectRepository->find($id); - $this->assertSame('fabuleux', $entity->translate('fr')->getTitle()); - $this->assertSame('fabuleux', $entity->translate('fr')->getExtendedTitle()); + /** @var ExtendedTranslatableEntityTranslation $frenchEntity */ + $frenchEntity = $entity->translate('fr'); + $this->assertSame('fabuleux', $frenchEntity->getTitle()); + $this->assertSame('fabuleux', $frenchEntity->getExtendedTitle()); - $this->assertSame('awesome', $entity->translate('en')->getTitle()); - $this->assertSame('awesome', $entity->translate('en')->getExtendedTitle()); + /** @var ExtendedTranslatableEntityTranslation $englishEntity */ + $englishEntity = $entity->translate('en'); + $this->assertSame('awesome', $englishEntity->getTitle()); + $this->assertSame('awesome', $englishEntity->getExtendedTitle()); - $this->assertSame('удивительный', $entity->translate('ru')->getTitle()); - $this->assertSame('удивительный', $entity->translate('ru')->getExtendedTitle()); + /** @var ExtendedTranslatableEntityTranslation $russianEntity */ + $russianEntity = $entity->translate('ru'); + $this->assertSame('удивительный', $russianEntity->getTitle()); + $this->assertSame('удивительный', $russianEntity->getExtendedTitle()); } } diff --git a/tests/ORM/Translatable/TranslatableTest.php b/tests/ORM/Translatable/TranslatableTest.php index a73364ea..9e45ee97 100644 --- a/tests/ORM/Translatable/TranslatableTest.php +++ b/tests/ORM/Translatable/TranslatableTest.php @@ -384,6 +384,8 @@ public function testTranslationIsNotEmptyWithZeroAsValue(): void } /** + * @param class-string $translatableClass + * @param class-string $translationClass * Asserts that the one to many relationship between translatable and translations is mapped correctly. */ private function assertTranslationsOneToManyMapped(string $translatableClass, string $translationClass): void diff --git a/tests/config/config_test.php b/tests/config/config_test.php index b480680d..7a20bf2e 100644 --- a/tests/config/config_test.php +++ b/tests/config/config_test.php @@ -11,12 +11,7 @@ use Psr\Log\Test\TestLogger; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Component\Security\Core\Security; -use Symplify\Amnesia\ValueObject\Symfony\Extension\Doctrine\DBAL; -use Symplify\Amnesia\ValueObject\Symfony\Extension\Doctrine\Mapping; -use Symplify\Amnesia\ValueObject\Symfony\Extension\Doctrine\ORM; -use Symplify\Amnesia\ValueObject\Symfony\Extension\DoctrineExtension; use function Symfony\Component\DependencyInjection\Loader\Configurator\service; -use function Symplify\Amnesia\Functions\env; return static function (ContainerConfigurator $containerConfigurator): void { $parameters = $containerConfigurator->parameters(); @@ -53,25 +48,24 @@ $services->set(LoggableEventSubscriber::class) ->arg('$logger', service(TestLogger::class)); - $containerConfigurator->extension(DoctrineExtension::NAME, [ - DoctrineExtension::DBAL => [ - DBAL::DBNAME => env('DB_NAME'), - DBAL::HOST => env('DB_HOST'), - DBAL::USER => env('DB_USER'), - DBAL::PASSWORD => env('DB_PASSWD'), - DBAL::DRIVER => env('DB_ENGINE'), - DBAL::MEMORY => (bool) env('DB_MEMORY'), + $containerConfigurator->extension('doctrine', [ + 'dbal' => [ + 'dbname' => '%env(DB_NAME)%', + 'host' => '%env(DB_HOST)%', + 'user' => '%env(DB_USER)%', + 'password' => '%env(DB_PASSWD)%', + 'driver' => '%env(DB_ENGINE)%', + 'memory' => '%env(bool:DB_MEMORY)%', ], - - DoctrineExtension::ORM => [ - ORM::AUTO_MAPPING => true, - ORM::MAPPINGS => [ + 'orm' => [ + 'auto_mapping' => true, + 'mappings' => [ [ - Mapping::NAME => 'DoctrineBehaviors', - Mapping::TYPE => 'attribute', - Mapping::PREFIX => 'Knp\DoctrineBehaviors\Tests\Fixtures\Entity\\', - Mapping::DIR => __DIR__ . '/../../tests/Fixtures/Entity', - Mapping::IS_BUNDLE => false, + 'name' => 'DoctrineBehaviors', + 'type' => 'attribute', + 'prefix' => 'Knp\DoctrineBehaviors\Tests\Fixtures\Entity\\', + 'dir' => __DIR__ . '/../../tests/Fixtures/Entity', + 'is_bundle' => false, ], ], ], diff --git a/utils/phpstan-behaviors/src/Type/StaticTranslationTypeHelper.php b/utils/phpstan-behaviors/src/Type/StaticTranslationTypeHelper.php index c08a8add..d8ea3fa5 100644 --- a/utils/phpstan-behaviors/src/Type/StaticTranslationTypeHelper.php +++ b/utils/phpstan-behaviors/src/Type/StaticTranslationTypeHelper.php @@ -55,22 +55,22 @@ public static function getTranslatableClass( ): string { $type = $scope->getType($methodCall->var); $translationClass = $type->getReferencedClasses()[0]; - $reflectionClass = $reflectionProvider->getClass($translationClass) + $nativeReflection = $reflectionProvider->getClass($translationClass) ->getNativeReflection(); - if ($reflectionClass->isInterface()) { - if ($reflectionClass->getName() === TranslationInterface::class) { + if ($nativeReflection->isInterface()) { + if ($nativeReflection->getName() === TranslationInterface::class) { return TranslatableInterface::class; } $errorMessage = sprintf( 'Unable to find the Translatable class associated to the Translation class "%s".', - $reflectionClass->getName() + $nativeReflection->getName() ); throw new PHPStanTypeException($errorMessage); } - return $reflectionClass + return $nativeReflection ->getMethod('getTranslatableEntityClass') ->invoke(null); }