12

我在一个codeigniter项目上使用composer从vlucas安装了phpdotenv。

我也添加了钩子,如果 v3.3 需要,我会有点困惑

    $hook['pre_system'] = function() {
    $dotenv = new Dotenv\Dotenv(APPPATH);
    $dotenv->load();
};

如果我不添加这个钩子,我将无法从我的 .env 文件中检索变量。如果我确实添加它,那么我会收到此错误:

消息:传递给 Dotenv\Dotenv::__construct() 的参数 1 必须是 Dotenv\Loader 的实例,给定字符串,在第 15 行的 C:\xampp\htdocs\test\application\config\hooks.php 中调用

文件名:C:\xampp\htdocs\test\vendor\vlucas\phpdotenv\src\Dotenv.php

似乎该类正在加载,但它不喜欢参数“APPPATH”,但我找到的所有文档都使用它。

任何帮助表示赞赏

4

4 回答 4

12

好的,所以改变这个钩子似乎是有效的,我不完全确定这是正确的方法,但挖掘库代码似乎没问题。

$hook['pre_system'] = function() {
    $dotenv = Dotenv\Dotenv::create(__DIR__);
    $dotenv->load();
}

如果由于任何原因这是错误的,请告诉我。谢谢

于 2019-02-28T11:12:51.320 回答
5

我尝试了所有解决方案,然后我发现我的 phpdotenv 版本是 4.xx 对于那些对上述解决方案为什么不起作用的人感到困惑。

这是使用 path 作为构造函数参数加载 env 的新方法:

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__.'/..');
$dotenv->load();
于 2020-05-09T03:53:54.810 回答
2

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 文件。参考链接

享受编码。. . !!!

于 2019-06-18T09:18:40.870 回答
0

做一个作曲家表演,看看是否加载了包。如果没有,请删除您的 composer.lock 文件,composer install 并再次检查。不知何故,如果您想保留 PHP 5,请将版本保持在 4 {"vlucas/phpdotenv": "4.1.0"}

于 2021-09-30T13:04:21.323 回答