Heim  >  Fragen und Antworten  >  Hauptteil

So vermeiden Sie Warnungen: Stellen Sie beim korrekten Markieren von call_user_func in PhpStorm/Lumen sicher, dass eine Ausnahme im entsprechenden „try“-Block ausgelöst wird.

<p>Ich habe in meiner Lumen-Anwendung eine Authentifizierungs-Middleware wie diese: </p> <pre class="brush:php;toolbar:false;">class Authentifizieren { öffentliches Funktionshandle(Request $request, Closure $next, string|null $guard = null): gemischt { versuchen { /**@var IlluminateAuthRequestGuard $requestGuard*/ $requestGuard = $this->auth->guard($guard); $signedIn = $requestGuard->check(); // ... } Catch (NoUserIdProvidedException) { // ... } // ... } }</pre> <p>Es funktioniert gut, aber PhpStorm meldet, dass die Ausnahmen (ich habe die meisten davon aus dem Beispiel entfernt, es gibt ein paar) nicht vom enthaltenden Block ausgelöst werden, obwohl sie es sind. </p> <p>Es scheint, dass es tief im Inneren von RequestGuard call_user_func</p> verwendet. <pre class="brush:php;toolbar:false;">return $this->user = call_user_func( $this->callback, $this->request, $this->getProvider() );</pre> <p>Rufen Sie den Abschlusssatz im AuthServiceProvider auf, der eine Middleware-Methode für die benutzerdefinierte Sicherheitsklasse verwendet: </p> <pre class="brush:php;toolbar:false;">class AuthServiceProvider erweitert ServiceProvider { öffentliche Funktion boot(): void { $this->app['auth']->viaRequest('api', function ($request) { $security = new Security(); return $security->middleware($request); }); } }</pre> <p>Meiner Meinung nach ist der Dokumentationsblock für die Middleware korrekt</p> <pre class="brush:php;toolbar:false;">/*** @param Request $request * @return bool|object|null * @throws InvalidDomainUser * @throws NoDomainUserException * @throws NoTokenOnRecordException * @throws NoTokenProvidedException * @throws NoUserException * @throws NoUserIdProvidedException*/ öffentliche Funktions-Middleware (Request $request): object|bool|null {</pre> <p>Fügen Sie einen Dokumentblock hinzu, zum Beispiel: </p> <pre class="brush:php;toolbar:false;">/*** @throws NoUserIdProvidedException*/</pre> <p>Beim Abschluss führt der Authentifizierungsanbieter oder der Verarbeitungscode nicht dazu, dass die Warnung verschwindet. Gibt es eine Möglichkeit, den Code zu kommentieren oder einen Tipp einzugeben, um Fehlalarme zu vermeiden? Ich möchte die Inspektion nicht einfach abschalten. </p>
P粉009186469P粉009186469435 Tage vor482

Antworte allen(1)Ich werde antworten

  • P粉805535434

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

    对于静态分析来说,守卫的工作方式似乎有点过于复杂,因此我进行了重构,将底层自定义代码从守卫中移出,直接移入中间件,这样就成功了,现在可以正确检测到异常.

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

    安全类是自定义逻辑,重要的是带有@throws的文档块足够接近,可以被IDE找到

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

    Antwort
    0
  • StornierenAntwort