2017-07-03 1 views
1

Wenn PHPStan auf meinem Code-Basis laufen bekomme ich den Fehler:PHPStan - Änderungstyp von Konstruktorparameter

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

Dies liegt daran, die Docblock Konstruktor nur einen String als gültig Typ angibt. Aber wenn Sie die eraseCredentials() Methode überprüfen, scheint es, dass null auch ein gültiger Wert für $credentials ist.

Nun möchte ich PHPStan anweisen, dass der Typ des $credentials Parameters string|null im Gegensatz zu string ist.

Ich denke, ich würde eine Implementierung von MethodsClassReflectionExtension benötigen, um das zu tun. Aber wenn ich das registriere, scheint es nicht die richtige Klasse zu sein.

Meine aktuelle Implementierung:

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(); 
    } 
} 

Was muss ich tun, um zu PHPStan verstehen, dass die $credentials Eigenschaft beide string und null Werte annimmt?

Antwort

2

Leider können Sie keine Erweiterungen verwenden, um Informationen zur vorhandenen Methode zu überschreiben. Es gibt derzeit keine Möglichkeit, PHPStan davon zu überzeugen, dass eine Methode eine andere Signatur als die im Code hat.

Ich bin ein wenig verwirrt durch den gemeldeten Fehler, denn UsernamePasswordToken akzeptiert derzeit mixed (was alles) als die Art von $credentials. Ihr Problem kann also einfach verschwinden, indem Sie Symfony aktualisieren (nicht sicher in welcher Version). Und ich weiß auch nicht, was Sie meinen, indem Sie auf die eraseCredentials Methode verweisen.

Wenn Sie ein ähnliches Problem und die Parameterdokumentation lösen müssen auch in der jüngsten Version der Abhängigkeit falsch ist, haben Sie derzeit zwei Möglichkeiten:

1) Senden Sie eine PR an die depedency, die ihre typehint fixiert oder phpDoc. 2) Schreiben Sie eine Regexp für ignoreErrors (siehe README), die dieses Problem ignoriert.

In Zukunft wird es eine dritte Option geben. Ich plane, das Überschreiben von Drittanbieter-Typen zu ermöglichen, indem ich dafür Konfigurationsoptionen anbiete.

+0

Offenbar hatte ich eine alte Version von 'symfony/security-core'. Ich habe es aktualisiert und jetzt ist dieser Fehler weg. Ich habe jedoch immer noch mehrere Fälle von diesem Problem übrig. Ich habe Ignorierregeln für diese Fälle hinzugefügt. –

Verwandte Themen