如何避免警告:在PhpStorm / Lumen中正确标记call_user_func时,确保在相应的'try'块中抛出异常?
P粉009186469
P粉009186469 2023-09-03 22:55:00
[PHP讨论组]

我的 Lumen 应用程序中有身份验证中间件,如下所示:

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

        // ...
    }
}

它工作得很好,但 PhpStorm 报告说,异常(我从示例中删除了大部分,有一些)不是由包含块抛出的,尽管它们是这样。

似乎在 RequestGuard 的深处它使用了 call_user_func

return $this->user = call_user_func(
    $this->callback, $this->request, $this->getProvider()
);

调用 AuthServiceProvider 中设置的闭包,该闭包使用自定义 Security 类上的中间件方法:

class AuthServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        $this->app['auth']->viaRequest('api', function ($request) {
            $security = new Security();

            return $security->middleware($request);
        });
    }
}

在我看来,中间件的文档块正确无误

/**
     * @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
    {

添加文档块,例如:

/**
* @throws NoUserIdProvidedException
*/

在闭包中,身份验证提供程序或处理代码不会使警告消失,是否有办法对代码进行注释或键入提示以避免误报?我不想直接关闭检查。

P粉009186469
P粉009186469

全部回复(1)
P粉805535434

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

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
    {
      // ....
    }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号