2013-03-08 2 views
1

При создании пакета композитора, который предназначен для запуска в рамках Laravel 4, я хочу создать набор подключения к базе данных по умолчанию, который выглядит примерно так:Eloquent 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, как это письмо соединение не соответствует синтаксису, который использует фасад Config. Поэтому с помощью:

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

... не будет работать, потому что класс DatabaseManager только ищет загруженную конфигурацию из laravelroot/приложение/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, чтобы посмотреть на p rovided connection name и разрешить детали конфигурации так же, как и для фасада Config. Но это не реализовано на момент написания этой статьи.

Я раскошелил каркас и представил запрос на тяну с потенциальным исправлением. Посмотрим, как это получится. На данный момент, вы можете использовать вышеуказанную работу вокруг в поставщика пакета услуг, а затем просто установить имя вашего соединения в вашей модели, как это:

protected $connection = 'reporting'; 

Поскольку массив соединений определяется в моем пакете конфигурации были объединенные с соединениями по умолчанию, определенными в laravelroot/app/config/database.php, это похоже на то, что соединение было фактически создано там в конфигурации приложения, поэтому нет необходимости в разрешении пакета в имени соединения внутри вашей модели.

Надеюсь, что это будет автоматизировано в будущих выпусках laravel 4, или будет реализован более интуитивный способ загрузки конфигурационных файлов базы данных пакета в поставщике услуг пакета.

Смежные вопросы