Dotenv 必须是 Dotenv\Loader 的一个实例
Posted
技术标签:
【中文标题】Dotenv 必须是 Dotenv\\Loader 的一个实例【英文标题】:Dotenv must be an instance of Dotenv\LoaderDotenv 必须是 Dotenv\Loader 的一个实例 【发布时间】:2019-07-22 02:27:21 【问题描述】:我在一个 codeigniter 项目上使用 composer 从 vlucas 安装了 phpdotenv。
我也添加了钩子,如果 v3.3 需要,我会有点困惑
$hook['pre_system'] = function()
$dotenv = new Dotenv\Dotenv(APPPATH);
$dotenv->load();
;
如果我不添加这个钩子,我将无法从我的 .env 文件中检索变量。如果我确实添加它,那么我会收到此错误:
消息:传递给 Dotenv\Dotenv::__construct() 的参数 1 必须是 Dotenv\Loader 实例,给定字符串,调用 C:\xampp\htdocs\test\application\config\hooks.php 第 15 行
文件名:C:\xampp\htdocs\test\vendor\vlucas\phpdotenv\src\Dotenv.php
似乎该类正在加载,但它不喜欢参数“APPPATH”,但我找到的所有文档都使用它。
任何帮助表示赞赏
【问题讨论】:
【参考方案1】:好的,因此将钩子更改为此似乎有效,我不完全确定这是正确的方法,但挖掘库代码似乎没问题。
$hook['pre_system'] = function()
$dotenv = Dotenv\Dotenv::create(__DIR__);
$dotenv->load();
如果由于任何原因这是错误的,请告诉我。谢谢
【讨论】:
你仍然可以使用APPPATH
,你有__DIR__
,但是是的,这是正确的——phpdotenv 已经更新,这是新的方法。
::create 对我不起作用,但正如包存储库自述文件中所述,(Dotenv\Dotenv::createImmutable(__DIR__))->load();
这确实有效【参考方案2】:
我尝试了所有解决方案,然后发现我的 phpdotenv 版本是 4.x.x。对于那些对上述解决方案不起作用的原因感到困惑的人。
这里是加载 env 的新方法,路径为构造函数参数:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__.'/..');
$dotenv->load();
【讨论】:
谢谢!那行得通!由于我试图将 dotenv 与 laravel envoy 一起使用,我不得不删除代码的'/..'
部分,因为 envoy 配置文件和 dotenv 都在同一个目录中。【参考方案3】:
Dotenv 必须是 Dotenv\Loader 的实例
实际上,您没有遵循将 Laravel 从任何版本升级到 5.8 的文档,我在搜索了几个小时后找到了解决方案。最后我找到了解决方案。您只需要在您的环境文件中替换此代码即可。
$env = $app->detectEnvironment(function()
$environmentPath = __DIR__.'/../.env';
$setEnv = trim(file_get_contents($environmentPath));
if (file_exists($environmentPath))
putenv('APP_ENV='.$setEnv);
if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env'))
$dotenv = Dotenv\Dotenv::create(__DIR__.'/../', '.'.getenv('APP_ENV').'.env');
$dotenv->overload();
);
这是一个链接,您可以在其中详细了解如何在 laravel 5.8 中使用多个 env 文件。 Reference Link
享受编码。 . . !!!
【讨论】:
putenv('APP_ENV='.$setEnv) 等是怎么回事?我删除了所有这些以使我的工作。【参考方案4】:做一个作曲家表演,看看包是否被加载。如果没有,请删除您的 composer.lock 文件,composer install 并再次检查。不知何故,如果您想保留 PHP 5,请将版本保持在 4 "vlucas/phpdotenv": "4.1.0"
【讨论】:
以上是关于Dotenv 必须是 Dotenv\Loader 的一个实例的主要内容,如果未能解决你的问题,请参考以下文章
Artisan 命令说:包含空格的 Dotenv 值必须用引号括起来