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 Model ファイルを作成し、次を使用して接続を設定しようとすると、

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

うまくいきません。次のような例外が発生します。

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

パッケージのデフォルト設定を使用して接続リゾルバーをデータベースに接続するために使用する必要があるマジック ストリング形式はありますか?

ご協力いただきありがとうございます!

4

1 に答える 1

1

さて、私は解決策を見つけました:

この記事の執筆時点でのLaravel4の接続処理は、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クラスを変更することにより、フレームワークで簡単に処理できます。ただし、この記事の執筆時点では実装されていません。

フレームワークをフォークし、修正の可能性があるプルリクエストを送信しました。それがどうなるか見ていきます。今のところ、パッケージサービスプロバイダーで上記の回避策を使用してから、モデルに接続の名前を次のように設定することができます。

protected $connection = 'reporting';

パッケージ構成で定義された接続の配列は、laravelroot / app / config / database.phpで定義されたデフォルトの接続とマージされているため、接続が実際にアプリ構成で作成されたかのようになり、パッケージは必要ありません。モデル内の接続名の解像度。

うまくいけば、これはlaravel 4の将来のリリースで自動化されるか、パッケージサービスプロバイダーにパッケージデータベース構成ファイルをロードするより直感的な方法が実装されるでしょう。

于 2013-03-13T05:17:12.780 に答える