2013-10-28 4 views
1

На первый взгляд, это может показаться излишним, так как мы определили providers в config/app.php к автозагрузку любой ServiceProvider, но оказывается, что есть сценарий, где они не будут автоматически загружаются:Laravel 4: загрузка Service Provider во время выполнения

Когда мы запускаем работу из Laravel Queue - казалось бы, мой ServiceProvider в config игнорируется полностью, поэтому DI не удалось с target ... is not instantiable.

Зарегистрируйте поставщиков услуг во время работы в работе. например

App::register('MyServiceProvider'); 

Есть ли причина, по которой Laravel не выполнил автозагрузку моего ServiceProvider в таком случае?

PS: Я открыл вопрос on github, так как я не являюсь, если это по дизайну.

+1

Я не встречало этого, и это может быть ошибкой, но только, чтобы поставить галочку очевидной ловушки - вы определение поставщиков услуг в вашем маршруте конфигурации или конфигурацию для конкретных условий - Я сгорел пару раз, задав окружения по URL-адресу (который явно не взят из командной строки), поэтому, если ваша конфигурация приложения находится в заданной URL-адресе, которая объяснит это. – WebweaverD

+0

@WebweaverD - О, человек, ты прав, хотя я и понял, что это может быть проблемой, я недостаточно пристально смотрю. Любые советы по определению среды, которая не зависит от URL-адреса? – bitinn

+0

Я отправил ответ с дополнительной информацией - дайте мне знать, как вы размещаете/запускаете свой dev-сайт, если у вас все еще есть проблемы – WebweaverD

ответ

1

Если вы определяете свою среду по URL-адресу, эти среды не будут автоматически распознаны из командной строки - я сам столкнулся с этой проблемой при попытке запуска миграции/семян.

Вы можете определить среду любым способом, так как определение среды принимает закрытие, но «из коробки» вы можете вернуть регулярное выражение, которое соответствует увядшему имени машины или URL-адресу. примеры здесь - environment config.

Одним из решений было бы определить поставщиков услуг в app.php на пути к вашей конфигурации (это конфигурация по умолчанию и будет использоваться, если никакие другие среды не будут распознаны из командной строки) ИЛИ, если вам нужны разные настройки для разных сред, которые вы могли бы попытаться определить ваши среды по имени машины - это имя хоста вашего компьютера - в окне unix вы можете увидеть, что это такое с echo $ HOSTNAME в командной строке.

Другим решением от OP

Как OP обнаружил, ремесленник принимает --env флаг на каждой командой, которая позволяет принудительно окружающую среду, так что вы можете вызвать PHP ремесленник очереди: работа - env = local, чтобы заставить его использовать локальную конфигурацию при работе с очередями.

Надеется, что это помогает

+1

на самом деле я думаю, что 'artisan' принимает флаг' --env' примерно для каждой команды , поэтому я могу по-прежнему 'php artisan queue: work --env = local', чтобы он использовал мою локальную конфигурацию. если вы можете добавить это, я приму этот ответ. – bitinn

+0

Я не знал, что вы могли бы это сделать, спасибо за информацию. Я обновил свой ответ, чтобы сделать его более полным. – WebweaverD

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