Формат конфигурации базы данных пакетов Eloquent 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')

и он возвращает массив выше.

Однако, когда я создаю файл модели Eloquent и пытаюсь установить соединение, используя

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

Это не работает. Я получаю исключение, говорящее:

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

Есть ли какой-то формат волшебной строки, который мне нужно использовать, чтобы заставить Connection Resolver подключиться к моей базе данных, используя конфигурацию по умолчанию в моем пакете?

Спасибо за вашу помощь!


person Jon Watson    schedule 08.03.2013    source источник


Ответы (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, или будет реализован более интуитивно понятный способ загрузки файлов конфигурации базы данных пакетов в поставщике услуг пакетов.

person Jon Watson    schedule 13.03.2013