Dotenv必须是Dotenv \ Loader

时间:2019-02-28 08:20:38

标签: php codeigniter codeigniter-3 dotenv

我在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”,但是我发现的所有文档都使用了该类。

任何帮助表示赞赏

3 个答案:

答案 0 :(得分:5)

好吧,所以改变这个钩子似乎是可行的,我不完全确定这是正确的方法,但是深入研究库代码似乎没问题。

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

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

答案 1 :(得分:4)

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

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

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__.'/..');
$dotenv->load();

答案 2 :(得分:1)

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

享受编码。 。 。 !!!