雄辩的Laravel 4包数据库配置格式



当创建一个要在Laravel 4框架中运行的编写器包时,我想创建一个默认的数据库连接集,看起来像这样:

// File Location: LARAVEL4_ROOT/vendor/my/package/src/config/database.php
return array(
'connections' => array(
    'reporting' => array(
        'driver'    => 'mysql',
        'host'      => getenv('REPORTING_HOST'),
        'database'  => getenv('REPORTING_DBNAME'),
        'username'  => getenv('REPORTING_USER'),
        'password'  => getenv('REPORTING_PASS'),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),
),
);

根据我能在网上找到的所有文档,一旦我使用服务提供商模式注册了我的项目并调用$this->package('my/package');Laravel 4应该会神奇地加载这个文件,并让我在配置中访问它。

并且我已经验证了我可以调用

 Config::get('package::database.connections.reporting')

,它返回上面的数组

然而,当我构造我的Eloquent Model文件,并尝试使用 设置连接时
protected $connection = 'package::database.connections.reporting';

它不工作。我得到一个异常:

InvalidArgumentException: Database [package::database.connections.reporting] not configured.

是否有一些神奇的字符串格式,我需要使用连接解析器连接到我的数据库使用默认配置在我的包?

谢谢你的帮助!

好了,我找到了一个解决方案:

在撰写本文时,Laravel 4中的连接处理似乎与Config facade使用的语法不一致。因此使用:

protected $connection = 'package::database.connections.reporting';

…不能工作,因为DatabaseManager类只搜索从laravelroot/app/config/database.php

加载的配置。因此,在编写本文时,建立包配置中定义的连接的唯一方法是修改包服务提供程序中先前加载的配置数组,如下所示:
public function boot()
{
    $this->package('vendor/package');
    include __DIR__."/routes.php";
    // Add my database configurations to the default set of configurations                        
    $this->app['config']['database.connections'] = array_merge(
        $this->app['config']['database.connections']
       ,Config::get('reporting::database.connections')
    );
}
这可以很容易地由框架处理,通过修改DatabaseManager类来查看所提供的连接名称,并以与Config facade相同的方式解析配置细节。但在撰写本文时,这还没有实现。

我已经分叉了框架,并提交了一个潜在的修复拉请求。我们看看会发生什么。现在,您可以在包服务提供程序中使用上述工作,然后在模型中设置连接的名称,如下所示:

protected $connection = 'reporting';

因为在我的包配置中定义的连接数组已经与laravelroot/app/config/database.php中定义的默认连接合并,所以好像连接实际上是在app配置中创建的,所以不需要在模型中的连接名称中进行包解析。

希望这将在laravel 4的未来版本中自动实现,或者在包服务提供商中加载包数据库配置文件的更直观的方式将被实现。

最新更新