在Laravel Eloquent中定义数据库架构时遇[db.schema]不存在错误求助
Laravel ORM集成第三方框架时出现"Target class [db.schema] does not exist"错误
我正在将Laravel ORM集成到第三方框架中,运行时抛出错误Target class [db.schema] does not exist。当前初始化容器的代码如下:
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Capsule\Manager as DB; use \Illuminate\Container\Container as Container; use \Illuminate\Support\Facades\Facade; /** * Setup a new app instance container * * @var Illuminate\Container\Container */ $app = new Container(); $app->singleton('app', 'Illuminate\Container\Container'); /** * Set $app as FacadeApplication handler */ Facade::setFacadeApplication($app);
错误发生在以下数据库连接配置代码执行之前,下方代码仅作参考:
$capsule = new DB; $conn = $capsule->addConnection([ 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'yf_testing', 'username' => 'yf_testing', 'password' => 'xxxxxx', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', 'prefix' => '', ]); // Make this Capsule instance available globally via static methods... (optional) $capsule->setAsGlobal(); // Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher()) $capsule->bootEloquent(); $schema = $capsule->schema('default');
相关堆栈跟踪信息:
Next Illuminate\Contracts\Container\BindingResolutionException: Target class [db.schema] does not exist. in /usr/local/repodeps/path/to/file/vendor/illuminate/container/Container.php:891 Stack trace: #0 /usr/local/repodeps/path/to/file/vendor/illuminate/container/Container.php(770): Illuminate\Container\Container->build('db.schema') #1 /usr/local/repodeps/path/to/file/vendor/illuminate/container/Container.php(706): Illuminate\Container\Container->resolve('db.schema', Array) #2 /usr/local/repodeps/path/to/file/vendor/illuminate/container/Container.php(1431): Illuminate\Container\Container->make('db.schema') #3 /usr/local/repodeps/path/to/file/vendor/illuminate/support/Facades/Facade.php(225): Illuminate\Container\Container->offsetGet('db.schema') #4 /usr/local/repodeps/path/to/file/vendor/illuminate/support/Facades/Facade.php(193): Illuminate\Support\Facades\Facade::resolveFacadeInstance('db.schema') #5 /usr/local/repodeps/path/to/file/vendor/illuminate/support/Facades/Facade.php(332): Illuminate\Support\Facades\Facade::getFacadeRoot() #6 /usr/local/apache/htdocs/domain.tld/app/migrations/skipper/database/migrations/2024_09_13_154018_skipper_migrations_Chat_2024091315401851.php(30): Illuminate\Support\Facades\Facade::__callStatic('create', Array) #7 /usr/local/apache/htdocs/domain.tld/defaults/core/chains/Testing/RunTests/RunTestsAction.class.php(72): SkipperMigrationsChat2024091315401851->up() #8 /usr/local/apache/htdocs/domain.tld/controller/ExecutionContainer.class.php(514): Testing\RunTests\Action->execute(Object(Request\Console)) #9 /usr/local/apache/htdocs/domain.tld/filter/Execution.class.php(410): ExecutionContainer->runAction() #10 /usr/local/apache/htdocs/domain.tld/filter/FilterChain.class.php(129): Filter\Execution->execute(Object(Filter\FilterChain), Object(ExecutionContainer)) #11 /usr/local/apache/htdocs/domain.tld/filter/Security.class.php(72): Filter\FilterChain->execute(Object(ExecutionContainer)) #12 /usr/local/apache/htdocs/domain.tld/filter/FilterChain.class.php(129): Filter\Security->execute(Object(Filter\FilterChain), Object(ExecutionContainer)) #13 /usr/local/apache/htdocs/domain.tld/controller/ExecutionContainer.class.php(297): Filter\FilterChain->execute(Object(ExecutionContainer)) #14 /usr/local/apache/htdocs/domain.tld/filter/Dispatch.class.php(44): ExecutionContainer->execute() #15 /usr/local/apache/htdocs/domain.tld/filter/FilterChain.class.php(129): Filter\Dispatch->execute(Object(Filter\FilterChain), Object(ExecutionContainer)) #16 /usr/local/apache/htdocs/domain.tld/controller/Controller.class.php(241): Filter\FilterChain->execute(Object(ExecutionContainer)) #17 /usr/local/apache/htdocs/domain.tld/public/development/console.php(27): Controller->dispatch() #18 {main} thrown in /usr/local/repodeps/path/to/file/vendor/illuminate/container/Container.php on line 891
我尝试过多种代码组合,但不清楚调整方向,无法定位问题根源,希望得到帮助。
问题分析
Laravel的Schema门面默认依赖容器中绑定的db.schema服务,但在自定义容器环境中,Capsule并不会自动将该服务注册到容器,导致门面解析实例失败。
解决方案
绑定Capsule到容器并注册db.schema服务
在初始化Capsule后,手动将其绑定到容器,并注册db.schema服务:$capsule = new DB; $conn = $capsule->addConnection([ 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'yf_testing', 'username' => 'yf_testing', 'password' => 'xxxxxx', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', 'prefix' => '', ]); // 将Capsule实例绑定到容器的db服务 $app->instance('db', $capsule); // 注册db.schema服务,返回指定连接的Schema构建器 $app->bind('db.schema', function ($app) { // 若需指定连接,可传入连接名,比如$app['db']->connection('default') return $app['db']->connection()->getSchemaBuilder(); }); $capsule->setAsGlobal(); $capsule->bootEloquent();直接使用Capsule实例操作Schema
避免依赖门面,直接通过Capsule实例获取Schema构建器:// 在迁移或业务代码中 $schema = $capsule->schema('default'); $schema->create('chat', function (Blueprint $table) { $table->id(); $table->string('content'); $table->timestamps(); });确认容器初始化顺序
确保容器初始化代码($app = new Container();及Facade::setFacadeApplication($app);)在所有数据库操作代码之前执行,保证门面能正确关联容器。
内容的提问来源于stack exchange,提问作者youdsmedia
相关产品推荐
相关产品推荐

