KnpLabs / DoctrineBehaviors

Doctrine2 behavior traits that help handling Blameable, Loggable, Sluggable, SoftDeletable, Uuidable, Timestampable, Translatable, Tree behavior
http://knplabs.com
MIT License
911 stars 287 forks source link

Fixing PHPStan issue #588

Closed jkabat closed 3 years ago

jkabat commented 3 years ago

I'm getting following error during PHPStan analyze:

PHP Fatal error:  Uncaught ReflectionException: Trying to invoke abstract method Knp\DoctrineBehaviors\Contract\Entity\TranslationInterface::getTranslatableEntityClass() in /app/vendor/knplabs/doctrine-behaviors/utils/phpstan-behaviors/src/Type/TranslationTypeHelper.php:34
Stack trace:
#0 /app/vendor/knplabs/doctrine-behaviors/utils/phpstan-behaviors/src/Type/TranslationTypeHelper.php(34): ReflectionMethod->invoke(NULL)
#1 /app/vendor/knplabs/doctrine-behaviors/utils/phpstan-behaviors/src/Type/TranslationGetTranslatableDynamicMethodReturnTypeExtension.php(44): Knp\DoctrineBehaviors\PHPStan\Type\TranslationTypeHelper::getTranslatableClass(Object(PHPStan\Broker\Broker), Object(PhpParser\Node\Expr\MethodCall), Object(PHPStan\Analyser\MutatingScope))
#2 phar:///app/vendor/phpstan/phpstan/phpstan/src/Analyser/MutatingScope.php(2530): Knp\DoctrineBehaviors\PHPStan\Type\TranslationGetTranslatableDynamicMethodReturnTypeExtension->getTypeFromMethodCall(Object(PHPStan\Reflection\ObjectTypeMethodReflection), Object(PhpParser\Node\Expr\Me in /app/vendor/knplabs/doctrine-behaviors/utils/phpstan-behaviors/src/Type/TranslationTypeHelper.php on line 34
Fatal error: Uncaught ReflectionException: Trying to invoke abstract method Knp\DoctrineBehaviors\Contract\Entity\TranslationInterface::getTranslatableEntityClass() in /app/vendor/knplabs/doctrine-behaviors/utils/phpstan-behaviors/src/Type/TranslationTypeHelper.php:34
Stack trace:
#0 /app/vendor/knplabs/doctrine-behaviors/utils/phpstan-behaviors/src/Type/TranslationTypeHelper.php(34): ReflectionMethod->invoke(NULL)
#1 /app/vendor/knplabs/doctrine-behaviors/utils/phpstan-behaviors/src/Type/TranslationGetTranslatableDynamicMethodReturnTypeExtension.php(44): Knp\DoctrineBehaviors\PHPStan\Type\TranslationTypeHelper::getTranslatableClass(Object(PHPStan\Broker\Broker), Object(PhpParser\Node\Expr\MethodCall), Object(PHPStan\Analyser\MutatingScope))
#2 phar:///app/vendor/phpstan/phpstan/phpstan/src/Analyser/MutatingScope.php(2530): Knp\DoctrineBehaviors\PHPStan\Type\TranslationGetTranslatableDynamicMethodReturnTypeExtension->getTypeFromMethodCall(Object(PHPStan\Reflection\ObjectTypeMethodReflection), Object(PhpParser\Node\Expr\Me in /app/vendor/knplabs/doctrine-behaviors/utils/phpstan-behaviors/src/Type/TranslationTypeHelper.php on line 34

Which is caused by this snippet:

use Knp\DoctrineBehaviors\Contract\Entity\TranslationInterface;
...
if ($entity instanceof TranslationInterface) {
    $translatable = $entity->getTranslatable();
    ...
}

What would you recommend to fix this error? @Kocal?

Kocal commented 3 years ago

Hum, I think it's because we try to call getTranslatableEntityClass directly on the TranslationInterface interface, and PHPStan could not resolve it.

Maybe we can try to update the following methods https://github.com/KnpLabs/DoctrineBehaviors/blob/master/utils/phpstan-behaviors/src/Type/TranslationTypeHelper.php#L13-L34, by checking if we have to deal a TranslationInterface. If it's the case, simply return an instance of TranslatableInterface, and vice-versa.

I'm actually on vacation, but I can try to work on it this week.

Kocal commented 3 years ago

I have a solution that works for Knp\DoctrineBehaviors\Contract\Entity\TranslationInterface and Knp\DoctrineBehaviors\Contract\Entity\TranslatableInterface base interfaces, but that won't work if you use custom Translation/Translatable interfaces.