database - 为 nWidart/laravel-modules 中的每个模块创建并使用自定义 config/database.php

标签 database laravel module configuration

在使用 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/

相关文章:

php - Laravel 5.1 删除关系

php - 如何在 Laravel 5.3 中创建两次连接到表的查询?

powershell - 从目录导入 PowerShell 脚本或模块

Linux模块版本错误 "Invalid module format"

database - 如何自动从数据库中索引solr中的数据

database - ignite apache 使用与 mongo db 使用 - 主要区别

Laravel 4 - 获取隐藏输入上的当前路由名称以用于搜索

performance - 第一次调用 Julia 很慢

database - 为什么 PostgreSQL 重新分配角色命令,更改模板数据库的所有者

database - SSD 使用对基本数据库假设有何影响?