Comment éviter les avertissements : lorsque vous marquez correctement call_user_func dans PhpStorm/Lumen, assurez-vous de lever une exception dans le bloc « try » correspondant ?
P粉009186469
2023-09-03 22:55:00
<p>J'ai un middleware d'authentification dans mon application Lumen comme ceci : </p>
<pre class="brush:php;toolbar:false;">class Authentifier
{
handle de fonction publique (Request $request, Closure $next, string|null $guard = null) : mixte
{
essayer {
/**@var IlluminateAuthRequestGuard $requestGuard*/
$requestGuard = $this->auth->guard($guard);
$signedIn = $requestGuard->check();
//...
} catch (NoUserIdProvidedException) {
//...
}
//...
}
}</pré>
<p>Cela fonctionne bien, mais PhpStorm rapporte que les exceptions (j'ai supprimé la plupart d'entre elles de l'exemple, il y en a quelques-unes) ne sont pas levées par le bloc conteneur, bien qu'elles le soient. </p>
<p>Il semble qu'au plus profond de RequestGuard, il utilise call_user_func</p>
<pre class="brush:php;toolbar:false;">return $this->user = call_user_func(
$this->rappel, $this->request, $this->getProvider()
);</pré>
<p>Appelez le jeu de fermetures dans AuthServiceProvider, qui utilise une méthode middleware sur la classe de sécurité personnalisée : </p>
<pre class="brush:php;toolbar:false;">class AuthServiceProvider étend ServiceProvider
{
fonction publique boot() : vide
{
$this->app['auth']->viaRequest('api', fonction ($request) {
$sécurité = nouvelle sécurité();
return $security->middleware($request);
});
}
}</pré>
<p>À mon avis, le bloc de documentation du middleware est correct</p>
<pre class="brush:php;toolbar:false;">/*** @param Demande $request
* @return bool|objet|null
* @throws Utilisateur de domaine invalide
* @throws NoDomainUserException
* @throws NoTokenOnRecordException
* @throws NoTokenProvidedException
* @throws NoUserException
* @throws NoUserIdProvidedException*/
middleware de fonction publique (Request $request) : object|bool|null
{</pré>
<p>Ajouter un bloc de document, par exemple : </p>
<pre class="brush:php;toolbar:false;">/*** @throws NoUserIdProvidedException*/</pre>
<p>Dans la fermeture, le fournisseur d'authentification ou le code de traitement ne fait pas disparaître l'avertissement, existe-t-il un moyen de commenter ou de taper un indice sur le code pour éviter les faux positifs ? Je ne veux pas simplement désactiver l'inspection. </p>
La façon dont fonctionne la garde semblait un peu trop complexe pour une analyse statique, j'ai donc refactorisé pour déplacer le code personnalisé sous-jacent hors de la garde et directement dans le middleware, ce qui a fonctionné et les exceptions sont désormais détectées correctement
.Les classes de sécurité sont une logique personnalisée, il est important que le bloc de documentation avec @throws soit suffisamment proche pour être trouvé par l'EDI