2013-03-08 48 views
1

当创建一个,就是在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') 

,并返回上述数组。

然而,当我建我的口才模型文件,并尝试设置使用

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

它不工作的连接。我得到一个异常的说法:

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

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

感谢您的帮助!

回答

1

好吧,我发现了一个解决方案:

看来,Laravel 4处理在写这篇文章的连接是不符合的配置外立面使用的语法一致。因此,使用:

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

...不会起作用,因为DatabaseManager类只搜索从laravelroot /应用/配置/ 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类看处理p rovided连接名称和解析配置详细信息与Config facade一样。但是这在撰写本文时尚未实施。

我分叉了框架并提交了一个可能修复的请求。我们会看看那是怎么回事。现在,你可以在你的包服务提供商周围使用上面的工作,然后只设置你的模型中的连接这样的名字:

protected $connection = 'reporting'; 

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

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