diff --git a/.github/workflows/phpcsfixer.yml b/.github/workflows/phpcsfixer.yml index 5f0bffb..366e61a 100644 --- a/.github/workflows/phpcsfixer.yml +++ b/.github/workflows/phpcsfixer.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-versions: ["8.3"] + php-versions: ["8.2"] name: PHP ${{ matrix.php-versions }} CS-Fixer ${{ matrix.operating-system }} diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index c4cb967..d4b38b7 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-versions: ["8.2", "8.3"] + php-versions: ["8.2", "8.3", "8.4"] name: PHP ${{ matrix.php-versions }} Static Analysis on ${{ matrix.operating-system }} diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index d681258..b4151cf 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -22,7 +22,10 @@ ->setRiskyAllowed(true) ->setFinder( PhpCsFixer\Finder::create() - ->in(__DIR__.'/src') + ->in([ + __DIR__.'/src', + __DIR__.'/config', + ]) ->append([__FILE__]) ) ; diff --git a/composer.json b/composer.json index 3ab2278..ce8baca 100644 --- a/composer.json +++ b/composer.json @@ -25,10 +25,10 @@ "symfony/validator": "^7.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.65", + "friendsofphp/php-cs-fixer": "^3.89", "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "^1.12", - "phpstan/phpstan-symfony": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-symfony": "^2.0", "symfony/doctrine-bridge": "^7.0" }, "extra": { diff --git a/config/definition.php b/config/definition.php index 26aa23d..feedd70 100644 --- a/config/definition.php +++ b/config/definition.php @@ -3,7 +3,7 @@ namespace Symfony\Component\Config\Definition\Configurator; return function (DefinitionConfigurator $definitionConfigurator): void { - $definitionConfigurator + $definitionConfigurator // @phpstan-ignore method.notFound ->rootNode() ->children() ->arrayNode('cause_resolver') diff --git a/phpstan.dist.neon b/phpstan.dist.neon new file mode 100644 index 0000000..408fe56 --- /dev/null +++ b/phpstan.dist.neon @@ -0,0 +1,10 @@ +parameters: + level: 9 + + paths: + - src/ + - config/ + + ignoreErrors: + - message: '#generic interface Symfony\\Component\\Form\\FormInterface but does not specify its types: TData#' + - message: '#extends generic class Symfony\\Component\\Form\\AbstractType but does not specify its types: TData#' diff --git a/phpstan.neon b/phpstan.neon deleted file mode 100644 index 90fb500..0000000 --- a/phpstan.neon +++ /dev/null @@ -1,8 +0,0 @@ -parameters: - level: 9 - - ignoreErrors: - - identifier: missingType.iterableValue - - paths: - - src diff --git a/src/Form/DataTransformer/BooleanTypeToBooleanDataTransformer.php b/src/Form/DataTransformer/BooleanTypeToBooleanDataTransformer.php index 33745fe..bdcae0a 100644 --- a/src/Form/DataTransformer/BooleanTypeToBooleanDataTransformer.php +++ b/src/Form/DataTransformer/BooleanTypeToBooleanDataTransformer.php @@ -10,6 +10,10 @@ */ class BooleanTypeToBooleanDataTransformer implements DataTransformerInterface { + /** + * @param array $trueValues + * @param array $falseValues + */ public function __construct( private readonly array $trueValues, private readonly array $falseValues, @@ -27,7 +31,7 @@ public function transform(mixed $value): string return $this->default ? 'true' : 'false'; } - if (!\is_bool($value)) { + if (!\is_bool($value)) { // @phpstan-ignore function.alreadyNarrowedType throw new TransformationFailedException(\sprintf('Expected type bool, found "%s".', \get_debug_type($value))); } @@ -40,7 +44,7 @@ public function reverseTransform(mixed $value): ?bool return $this->default; } - if (\is_string($value)) { + if (\is_string($value)) { // @phpstan-ignore function.alreadyNarrowedType $value = \strtolower($value); } diff --git a/src/Form/DataTransformer/CapitalizeStringDataTransformer.php b/src/Form/DataTransformer/CapitalizeStringDataTransformer.php index 9e72d4b..8028fa4 100644 --- a/src/Form/DataTransformer/CapitalizeStringDataTransformer.php +++ b/src/Form/DataTransformer/CapitalizeStringDataTransformer.php @@ -26,7 +26,7 @@ public function reverseTransform(mixed $value): ?string return $value; } - if (!\is_string($value)) { + if (!\is_string($value)) { // @phpstan-ignore function.alreadyNarrowedType throw new TransformationFailedException('Expected type string.'); } diff --git a/src/Form/DataTransformer/StringToUuidDataTransformer.php b/src/Form/DataTransformer/StringToUuidDataTransformer.php index ab422f2..299bcc7 100644 --- a/src/Form/DataTransformer/StringToUuidDataTransformer.php +++ b/src/Form/DataTransformer/StringToUuidDataTransformer.php @@ -32,7 +32,7 @@ public function reverseTransform(mixed $value): ?string return $value; } - if (!$value instanceof Uuid) { + if (!$value instanceof Uuid) { // @phpstan-ignore instanceof.alwaysTrue throw new TransformationFailedException('Expected type Uuid, found '.\get_debug_type($value)); } diff --git a/src/Form/DataTransformer/UuidToStringDataTransformer.php b/src/Form/DataTransformer/UuidToStringDataTransformer.php index b207532..77590b9 100644 --- a/src/Form/DataTransformer/UuidToStringDataTransformer.php +++ b/src/Form/DataTransformer/UuidToStringDataTransformer.php @@ -25,7 +25,7 @@ public function transform(mixed $value): ?string return null; } - if (!$value instanceof Uuid) { + if (!$value instanceof Uuid) { // @phpstan-ignore instanceof.alwaysTrue throw new TransformationFailedException('Expected a Uuid.'); } @@ -44,7 +44,7 @@ public function reverseTransform(mixed $value): ?Uuid return null; } - if (!\is_string($value)) { + if (!\is_string($value)) { // @phpstan-ignore function.alreadyNarrowedType throw new TransformationFailedException('Expected a string.'); } diff --git a/src/Form/Extension/UuidTypeExtension.php b/src/Form/Extension/UuidTypeExtension.php index 820f7cc..4325ef9 100644 --- a/src/Form/Extension/UuidTypeExtension.php +++ b/src/Form/Extension/UuidTypeExtension.php @@ -22,7 +22,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void } $builder - ->addViewTransformer(new UuidToStringDataTransformer($options['nil_to_null'])) // @phpstan-ignore-line + ->addViewTransformer(new UuidToStringDataTransformer($options['nil_to_null'])) // @phpstan-ignore argument.type ; } diff --git a/src/Form/FormProcessor.php b/src/Form/FormProcessor.php index 8a340d1..d42042e 100644 --- a/src/Form/FormProcessor.php +++ b/src/Form/FormProcessor.php @@ -32,6 +32,7 @@ public function processForm(FormInterface $form, object &$object, array $ignored $key = $propertyPath->getElement(0); if ($childForm->isSubmitted() && $childForm->isValid()) { + // @phpstan-ignore-next-line parameterByRef.type $this->propertyAccessor->setValue($object, $key, $childForm->getData()); } } diff --git a/src/Form/Type/BooleanType.php b/src/Form/Type/BooleanType.php index 4c0c2ad..f8e8943 100644 --- a/src/Form/Type/BooleanType.php +++ b/src/Form/Type/BooleanType.php @@ -19,9 +19,9 @@ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->addModelTransformer(new BooleanTypeToBooleanDataTransformer( - $options['true_values'], // @phpstan-ignore-line - $options['false_values'], // @phpstan-ignore-line - $options['default_value'] // @phpstan-ignore-line + $options['true_values'], // @phpstan-ignore argument.type + $options['false_values'], // @phpstan-ignore argument.type + $options['default_value'] // @phpstan-ignore argument.type )) ; } @@ -37,5 +37,7 @@ public function configureOptions(OptionsResolver $resolver): void ]); $resolver->setAllowedTypes('default_value', ['bool', 'null']); + $resolver->setAllowedTypes('true_values', 'array'); + $resolver->setAllowedTypes('false_values', 'array'); } } diff --git a/src/ParamResolver/DotEncodingParamResolver.php b/src/ParamResolver/DotEncodingParamResolver.php index e692a3f..f8e208c 100644 --- a/src/ParamResolver/DotEncodingParamResolver.php +++ b/src/ParamResolver/DotEncodingParamResolver.php @@ -35,8 +35,7 @@ public function resolveParam(FormError $formError): ?string $key = \implode('.', $keys); - // @phpstan-ignore-next-line - if ('' === $key) { + if ('' === $key) { // @phpstan-ignore identical.alwaysFalse return null; } diff --git a/src/SBSEDVFormBundle.php b/src/SBSEDVFormBundle.php index f1f6a0b..ff473d9 100644 --- a/src/SBSEDVFormBundle.php +++ b/src/SBSEDVFormBundle.php @@ -9,6 +9,9 @@ class SBSEDVFormBundle extends AbstractBundle { + /** + * @param array> $config + */ public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void { $container->import('../config/services/cause_resolver.php'); diff --git a/src/Serializer/Normalizer/FormErrorNormalizer.php b/src/Serializer/Normalizer/FormErrorNormalizer.php index 6ac6c0d..33af38f 100644 --- a/src/Serializer/Normalizer/FormErrorNormalizer.php +++ b/src/Serializer/Normalizer/FormErrorNormalizer.php @@ -53,6 +53,7 @@ public function normalize(mixed $object, ?string $format = null, array $context } $error = [ + // @phpstan-ignore-next-line array.invalidKey $messageKey => $this->messageResolver->resolveMessage($formError) ?? $formError->getMessage(), $typeKey => $errorType, ]; diff --git a/src/Serializer/Normalizer/UnsubmittedFormNormalizer.php b/src/Serializer/Normalizer/UnsubmittedFormNormalizer.php index 9a67af2..ae06df4 100644 --- a/src/Serializer/Normalizer/UnsubmittedFormNormalizer.php +++ b/src/Serializer/Normalizer/UnsubmittedFormNormalizer.php @@ -25,6 +25,7 @@ public function __construct( public function normalize(mixed $object, ?string $format = null, array $context = []): array { return [[ + // @phpstan-ignore-next-line array.invalidKey $context[self::CONTEXT_MESSAGE_KEY] ?? 'message' => $this->translator->trans('request_body_is_empty', domain: 'sbsedv_form'), 'type' => $context[self::CONTEXT_ERROR_TYPE] ?? 'invalid_request_error', ]];