Lumen アプリケーションには次のような認証ミドルウェアがあります:
クラス認証 { パブリック関数ハンドル(Request $request、Closure $next、string|null $guard = null): 混合 { 試す { /**@var \Illuminate\Auth\RequestGuard $requestGuard*/ $requestGuard = $this->auth->guard($guard); $signedIn = $requestGuard->check(); // ... } catch (NoUserIdProvidedException) { // ... } // ... } }
これは正常に動作しますが、PhpStorm は、例外 (例からほとんどを削除しましたが、いくつかあります) は含まれているブロックによってスローされているにもかかわらず、スローされていないことを報告します。
RequestGuard の奥深くで call_user_func
が使用されているようです。return $this->user = call_user_func( $this->コールバック、$this->リクエスト、$this->getProvider() );
AuthServiceProvider 内のクロージャ セットを呼び出します。これは、カスタム Security クラスのミドルウェア メソッドを使用します。
class AuthServiceProvider extends ServiceProvider { パブリック関数 boot(): void { $this->app['auth']->viaRequest('api', function ($request) { $security = 新しいセキュリティ(); return $security->middleware($request); }); } }
私の意見では、ミドルウェアのドキュメント ブロックは正しいです
/*** @param リクエスト $request * @return bool|object|null * @throws無効なドメインユーザー * @throws NoDomainUserException * @throws NoTokenOnRecordException * @throws NoTokenProvidedException * @throws NoUserException * @throws NoUserIdProvidedException*/ パブリック関数ミドルウェア(Request $request): object|bool|null {
ドキュメント ブロックを追加します。例:
/*** @throws NoUserIdProvidedException*/
クロージャでは、認証プロバイダーまたは処理コードによって警告が消えません。誤検知を避けるためにコードにコメントまたはタイプヒントを付ける方法はありますか?ただ検査を止めたくない。
ガードの動作方法は静的分析には少し複雑すぎるように思えたので、基盤となるカスタム コードをガードから直接ミドルウェアに移動するようにリファクタリングしました。これは機能し、異常が正しく検出されるようになりました。
リーリーセキュリティ クラスはカスタム ロジックです。重要なのは、@throws を含むドキュメント ブロックが IDE によって検出されるのに十分近いことです。
リーリー