1

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

// 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 模型文件并尝试使用

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

它不起作用。我得到一个例外说:

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

我需要使用一些魔术字符串格式来让连接解析器使用我的包中的默认配置连接到我的数据库吗?

谢谢你的帮助!

4

1 回答 1

1

好的,我找到了解决方案:

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

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 门面相同的方式解析配置细节来处理。但这在撰写本文时尚未实施。

我已经分叉了框架并提交了一个带有潜在修复的拉取请求。我们会看看情况如何。现在,您可以在您的包服务提供商中使用上述解决方法,然后在您的模型中设置连接的名称,如下所示:

protected $connection = 'reporting';

由于我的包配置中定义的连接数组已经与 laravelroot/app/config/database.php 中定义的默认连接合并,就好像连接实际上是在应用配置中创建的,所以不需要包模型内连接名称的分辨率。

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

于 2013-03-13T05:17:12.780 回答