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 值必须用引号括起来

在 `npm install` 之前用 dotenv 替换 .npmrc 中的 env 变量

dotenv 是什么 怎么使用

致命错误:在中找不到类 'Dotenv\Dotenv'

是否可以在反应项目中使用 dotenv?

为啥使用 dotenv 库而不是解析 ini 文件?