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