我在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”,但是我发现的所有文档都使用了该类。
任何帮助表示赞赏
答案 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
享受编码。 。 。 !!!