1

乍一看,这似乎是不必要的,因为我们已经定义providersconfig/app.phpautoload any ServiceProvider,但事实证明它们不会被自动加载:

当我们从 Laravel 运行作业时Queue- 我ServiceProvider的配置似乎完全被忽略了,所以 DI 失败了target ... is not instantiable.

在运行时在作业中注册我的服务提供者确实有效。例如

App::register('MyServiceProvider');

在这种情况下,Laravel 没有自动加载我的 ServiceProvider 是否有原因?

PS:我也在 github 上打开了一个问题,因为如果这是设计使然,我不是。

4

1 回答 1

1

如果您通过 URL 定义环境,这些环境将不会从命令行自动识别 - 我自己在尝试运行迁移/种子时遇到了这个问题。

您可以以任何您喜欢的方式定义环境,因为环境定义接受闭包,但“开箱即用”您可以返回与机器名称或 url 匹配的正则表达式。此处的示例 -环境配置

一种解决方案是在配置路径的 app.php 中定义您的服务提供者(这是默认配置,如果从命令行没有识别出其他环境,则将使用该配置)或者如果您需要针对不同环境进行不同设置您可以尝试通过机器名称定义您的环境 - 这是您机器的主机名 - 在 unix 框中,您可以在命令行上使用 echo $HOSTNAME 看到这是什么。

OP的另一个解决方案

正如 OP 所发现的那样,artisan 几乎在每个允许您强制环境的命令上都接受 --env 标志,因此您可以调用 php artisan queue:work --env=local 来强制它在工作队列时使用本地配置.

希望这可以帮助

于 2013-10-28T09:57:07.160 回答