2017-07-03 1 views
1

Lors de l'exécution PHPStan sur mon codebase je reçois l'erreur:PHPStan - modifier le type de paramètre constructeur

Parameter #2 $credentials of class Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken constructor expects string, null given. 

En effet, spécifie uniquement une chaîne de docblock du constructeur de type comme valide. Mais quand vous vérifiez la méthode eraseCredentials(), il semble que null est également une valeur valide pour $credentials.

Maintenant, je veux demander PHPStan que le type du paramètre $credentials est string|null par opposition à string.

Je pense que j'aurais besoin d'une implémentation de MethodsClassReflectionExtension pour le faire. Mais quand je l'enregistre, il ne semble pas être appelé pour la bonne classe.

Ma mise en œuvre actuelle:

class UsernamePasswordToken implements MethodsClassReflectionExtension 
{ 
    public function hasMethod(ClassReflection $classReflection, string $methodName): bool 
    { 
     if ($classReflection->getName()===\Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::class) { 
      var_dump(__FILE__ . ':' . __LINE__ . ' :: ' . __METHOD__);die(); 
     } 
     if ($methodName === '__construct' && $classReflection->getName() === UsernamePasswordTokenClass::class) { 
      return true; 
     } 

     return false; 
    } 

    public function getMethod(ClassReflection $classReflection, string $methodName): MethodReflection 
    { 
     var_dump(__FILE__ . ':' . __LINE__ . ' :: ' . __METHOD__);die(); 
    } 
} 

Que dois-je faire pour PHPStan comprendre que la propriété $credentials accepte les string et null valeurs?

Répondre

2

Malheureusement, vous ne pouvez pas utiliser d'extensions pour remplacer les informations sur la méthode existante. Il n'y a actuellement aucun moyen de convaincre PHPStan qu'une méthode a une signature différente de celle du code.

Je suis un peu confus par l'erreur signalée, car UsernamePasswordToken accepte actuellement mixed (tout sens) que le type de $credentials. Votre problème peut donc disparaître simplement en mettant à niveau Symfony (pas sûr de quelle version). Et aussi je ne sais pas ce que vous voulez dire en faisant référence à la méthode eraseCredentials.

Si vous avez besoin pour résoudre un problème similaire et la documentation des paramètres est erroné, même dans la version récente de votre dépendance, vous avez actuellement deux options:

1) Envoyer un PR au depedency qui fixe leur typehint ou phpDoc. 2) Ecrire une expression rationnelle pour ignoreErrors (voir README) qui ignore ce problème.

À l'avenir, il y aura une troisième option. Je prévois d'activer des types de tierces parties en prévoyant des options de configuration pour cela.

+0

Apparemment j'avais une ancienne version de 'symfony/security-core'. Je l'ai mis à jour et maintenant cette erreur est partie. J'ai encore plusieurs cas de ce problème à gauche. J'ai ajouté ignorer les règles pour ces cas. –