如何避免警告:在PhpStorm / Lumen中正確標記call_user_func時,確保在相應的'try'區塊中拋出異常?
P粉009186469
2023-09-03 22:55:00
<p>我的 Lumen 應用程式中有驗證中間件,如下所示:</p>
<pre class="brush:php;toolbar:false;">class Authenticate
{
public function handle(Request $request, Closure $next, string|null $guard = null): mixed
{
try {
/**@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->callback, $this->request, $this->getProvider()
);</pre>
<p>呼叫 AuthServiceProvider 中設定的閉包,該閉包使用自訂 Security 類別上的中間件方法:</p>
<pre class="brush:php;toolbar:false;">class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
$this->app['auth']->viaRequest('api', function ($request) {
$security = new Security();
return $security->middleware($request);
});
}
}</pre>
<p>在我看來,中間件的文件區塊正確無誤</p>
<pre class="brush:php;toolbar:false;">/*** @param 請求 $request
* @return bool|物件|null
* @拋出InvalidDomainUser
* @拋出NoDomainUserException
* @拋出NoTokenOnRecordException
* @拋出NoTokenProvidedException
* @拋出NoUserException
* @拋出NoUserIdProvidedException*/
public function middleware(Request $request): object|bool|null
{</pre>
<p>新增文件區塊,例如:</p>
<pre class="brush:php;toolbar:false;">/*** @拋出NoUserIdProvidedException*/</pre>
<p>在閉包中,身份驗證提供者或處理代碼不會使警告消失,是否有辦法對程式碼進行註解或鍵入提示以避免誤報?我不想直接關閉檢查。 </p>
對於靜態分析來說,守衛的工作方式似乎有點過於複雜,因此我進行了重構,將底層自訂程式碼從守衛中移出,直接移入中間件,這樣就成功了,現在可以正確檢測到異常.
安全類別是自訂邏輯,重要的是具有@throws的文件區塊足夠接近,可以被IDE找到