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
P粉009186469 2023-09-03 22:55:00
0
1
485
<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>
P粉009186469
P粉009186469

répondre à tous(1)
P粉805535434

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

.
class Authenticate
{
    public function handle(Request $request, Closure $next, string|null $guard = null): mixed
    {
        try {
            $security = new Security();
            $user = $security->middleware($request);
            $signedIn = !empty($user->id);

            // ...

        } catch (NoUserIdProvidedException) {
            // ...
        }

        // ...
    }
}

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

class Security{
    /**
     * @param Request $request
     * @return bool|object|null
     * @throws InvalidDomainUser
     * @throws NoDomainUserException
     * @throws NoTokenOnRecordException
     * @throws NoTokenProvidedException
     * @throws NoUserException
     * @throws NoUserIdProvidedException
     */
    public function middleware(Request $request): object|bool|null
    {
      // ....
    }
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal