Laravel 11执行config:cache报错:Target class [hash]不存在
问题描述
我刚创建了一个全新的Laravel项目,并安装了Sentry用于异常日志记录。以下是我的bootstrap/app.php代码:
<?php use Illuminate\Foundation\Application; use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Middleware; use Illuminate\Support\Facades\Auth; use Sentry\Laravel\Integration; use Sentry\State\Scope; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__ . '/../routes/web.php', commands: __DIR__ . '/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { // }) ->withExceptions(function (Exceptions $exceptions) { Integration::handles($exceptions); Integration::configureScope( function (Scope $scope): void { $user = Auth::user(); if ($user) { $scope->setUser([ 'id' => $user->id, 'email' => $user->email, 'username' => $user->name, ]); } } ); })->create();
执行命令php artisan config:cache时,出现如下错误:
Illuminate\Contracts\Container\BindingResolutionException Target class [hash] does not exist. at vendor/laravel/framework/src/Illuminate/Container/Container.php:940 936▕ 937▕ try { 938▕ $reflector = new ReflectionClass($concrete); 939▕ } catch (ReflectionException $e) { ➜ 940▕ throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e); 941▕ } 942▕ 943▕ // If the type is not instantiable, the developer is attempting to resolve 944▕ // an abstract type such as an Interface or Abstract Class and there is
解决方案
问题根源是:执行config:cache时Laravel服务容器尚未完全初始化,Auth::user()依赖的hash服务还未注册,此时调用Auth组件会触发绑定解析异常。
你可以通过两种方式修复:
方式一:使用延迟回调获取用户
修改bootstrap/app.php中的configureScope逻辑,用setUserCallback延迟用户信息的获取,让Sentry在实际捕获异常时再执行用户信息获取操作:
Integration::configureScope( function (Scope $scope): void { $scope->setUserCallback(function () { $user = Auth::user(); if ($user) { return [ 'id' => $user->id, 'email' => $user->email, 'username' => $user->name, ]; } return null; }); } );
方式二:移至服务提供者的boot方法
将Sentry的用户信息配置逻辑移到AppServiceProvider的boot方法中,该阶段服务容器已完成初始化,Auth组件可正常使用:
// app/Providers/AppServiceProvider.php use Illuminate\Support\Facades\Auth; use Sentry\Laravel\Integration; use Sentry\State\Scope; public function boot() { Integration::configureScope(function (Scope $scope) { $user = Auth::user(); if ($user) { $scope->setUser([ 'id' => $user->id, 'email' => $user->email, 'username' => $user->name, ]); } }); }
修改后重新执行php artisan config:cache即可正常完成配置缓存。
内容的提问来源于stack exchange,提问作者Moddaser Hossain
相关产品推荐
相关产品推荐

