【问题标题】:Eloquent Laravel 4 package database configuration formatEloquent Laravel 4 封装数据库配置格式
【发布时间】:2013-02-24 15:08:10
【问题描述】:

当创建一个打算在 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.

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

感谢您的帮助!

【问题讨论】:

    标签: php connection package laravel-4 eloquent


    【解决方案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 的未来版本中实现自动化,或者实现在包服务提供商中加载包数据库配置文件的更直观的方式。

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 2014-07-15
      • 2014-03-15
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 2017-07-23
      • 2017-05-04
      • 2012-08-29
      相关资源
      最近更新 更多