Home » Php » php – Dotenv must be an instance of Dotenv\Loader

php – Dotenv must be an instance of Dotenv\Loader

Posted by: admin July 12, 2020 Leave a comment


I installed phpdotenv from vlucas using composer on a codeigniter project.

I have added the hook as well which I am bit confused if needed for v3.3

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

If I don’t add this hook I can’t retrieve variables from my .env file. If I do add it, then I get this error:

Message: Argument 1 passed to Dotenv\Dotenv::__construct() must be an
instance of Dotenv\Loader, string given, called in
C:\xampp\htdocs\test\application\config\hooks.php on line 15

Filename: C:\xampp\htdocs\test\vendor\vlucas\phpdotenv\src\Dotenv.php

Seems like the class is loading but it doesn’t like the parameter “APPPATH” but all of the documentation I have found uses that.

Any help appreciated

How to&Answers:

Ok so changing that hook to this seems to be working, I am not entirely sure it’s the correct approach but digging into the library code seems ok.

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

If this is wrong for any reason please let me know. Thanks


Dotenv must be an instance of Dotenv\Loader

Actually you are not following documentation of upgrading Laravel from any version to 5.8, I have found solution after searching of few hours. Finally i found the solution. You just need to replace this code in your environment file.

$env = $app->detectEnvironment(function(){
$environmentPath = __DIR__.'/../.env';
$setEnv = trim(file_get_contents($environmentPath));
if (file_exists($environmentPath))
    if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) {
        $dotenv = Dotenv\Dotenv::create(__DIR__.'/../', '.'.getenv('APP_ENV').'.env');

Here is a link where you can check in details how to use multiple env files in laravel 5.8. Reference Link

Enjoy the coding . . . !!!


I tried all solutions then I found that my version of phpdotenv was 4.x.x. For those who have some confusions of why the solutions don’t work.

Here is the new way to load the env with path as the constructor param:

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