在使用 nWidart/laravel-modules 创建的每个模块中,都有一个 Config
目录,其中包含一个 config.php
文件:
<?php
return [
'name' => 'Contracts'
];
现在,文档指出你应该在这个目录中编写模块的配置,所以我在里面放置了一个 database.php
文件,其中包含我的模块的自定义连接,名为 module1
:
<?php
return [
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
'module1' => [
'driver' => 'mysql',
'url' => env( 'DATABASE_URL' ),
'host' => env( 'DB_MODULE1_HOST', '127.0.0.1' ),
'port' => env( 'DB_MODULE1_PORT', '3306' ),
'database' => env('DB_MODULE1_DATABASE', 'forge'),
'username' => env( 'DB_MODULE1_USERNAME', 'forge' ),
'password' => env( 'DB_MODULE1_PASSWORD', '' ),
'unix_socket' => env( 'DB_MODULE1_SOCKET', '' ),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded( 'pdo_mysql' ) ?
array_filter( [ PDO::MYSQL_ATTR_SSL_CA => env( 'MYSQL_ATTR_SSL_CA' ), ] ) : [],
],
],
];
在项目根目录下的 .env
文件中(因为我不知道如何为我的模块创建自定义环境),我添加了几行:
DB_CONNECTION_MODULE1=module1
DB_MODULE1_DATABASE=module1database
DB_MODULE1_USERNAME=root
DB_MODULE1_PASSWORD=password
例如,我的一个迁移看起来像这样:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateObjectivesTable extends Migration{
/**
* Run the migrations.
*
* @return void
*/
public function up(){
Schema::connection( env( 'DB_DATABASE_MODULE1' ) )->create( 'objectives', function( Blueprint $table ){
$table->id();
$table->text( 'description' );
$table->timestamp( 'created_at' )->default( DB::raw( 'CURRENT_TIMESTAMP' ) );
$table->timestamp( 'updated_at' )->default( DB::raw( 'CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP' ) );
} );
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down(){
Schema::connection( env( 'DB_DATABASE_MODULE1' ) )->dropIfExists( 'objectives' );
}
}
我原以为当我运行迁移时,模块的表会在它们自己的数据库 (module1database
) 中创建,但它不起作用:
Migrating: 2020_11_10_134237_create_objectives_table
InvalidArgumentException
Database connection [module1] not configured.
at \path\to\my\site\vendor\laravel\framework\src\Illuminate\Database\DatabaseManager.php:152
148▕ // If the configuration doesn't exist, we'll throw an exception and bail.
149▕ $connections = $this->app['config']['database.connections'];
150▕
151▕ if (is_null($config = Arr::get($connections, $name))) {
➜ 152▕ throw new InvalidArgumentException("Database connection [{$name}] not configured.");
153▕ }
154▕
155▕ return (new ConfigurationUrlParser)
156▕ ->parseConfiguration($config);
1 \path\to\my\site\vendor\laravel\framework\src\Illuminate\Database\DatabaseManager.php:115
Illuminate\Database\DatabaseManager::configuration("module1")
2 \path\to\my\site\vendor\laravel\framework\src\Illuminate\Database\DatabaseManager.php:86
Illuminate\Database\DatabaseManager::makeConnection("module1")
我想,我仍然需要做一些事情来读取 Modules\Module1\Config\database.php
,我们将不胜感激。我还希望能够在模块中包含我的模块的环境(可能类似于 \Modules\Module1\.env
),这也将不胜感激。
最佳答案
在模块服务提供者的 registerConfig 方法中添加这个(V6 及更高版本)
$this->mergeConfigFrom(
module_path($this->moduleName, 'Config/database.php'),
'database.connections.module1'
);
旧版本
$this->mergeConfigFrom(
__DIR__.'/../Config/database.php',
'database.connections.module1'
);
然后像这样编辑你的 Config/database.php 文件
return [
'driver' => 'mysql',
'url' => env( 'DATABASE_URL' ),
'host' => env( 'DB_MODULE1_HOST', '127.0.0.1' ),
'port' => env( 'DB_MODULE1_PORT', '3306' ),
'database' => env('DB_MODULE1_DATABASE', 'forge'),
'username' => env( 'DB_MODULE1_USERNAME', 'forge' ),
'password' => env( 'DB_MODULE1_PASSWORD', '' ),
'unix_socket' => env( 'DB_MODULE1_SOCKET', '' ),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded( 'pdo_mysql' ) ?
array_filter( [ PDO::MYSQL_ATTR_SSL_CA => env( 'MYSQL_ATTR_SSL_CA' ), ] ) : [],
];
关于database - 为 nWidart/laravel-modules 中的每个模块创建并使用自定义 config/database.php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64779274/