Maison  >  Questions et réponses  >  le corps du texte

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>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粉009186469P粉009186469434 Il y a quelques jours478

répondre à tous(1)je répondrai

  • P粉805535434

    P粉8055354342023-09-04 21:30:05

    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
        {
          // ....
        }
    }

    répondre
    0
  • Annulerrépondre