How to use phpdotenv library on my whole project?

Rau*_*osa 3 php frameworks autoload phpdotenv

I started a project using composer and donlowaded the package vlucas/phpdotenv. I would like to call the $_ENV['name'] for example in my whole project without needing to instantiate the dot env in every class like that:

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
Run Code Online (Sandbox Code Playgroud)

How can I achieve that like a laravel framework does for example?

Another question is I tough I needed to import my autoload require __DIR__.'/../vendor/autoload.php'; in order to call use Dotenv\Dotenv;...

我如何在类中使用 Dotenv 而不需要自动加载?

编辑添加index.php:

<?php

use Dotenv\Dotenv;

require __DIR__.'/vendor/autoload.php';

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
Run Code Online (Sandbox Code Playgroud)

我现在如何自动启动它?

Zol*_*abó 9

通常,您有一个引导文件,其中包含 Composerautoload.php和其他常见内容,例如Dotenv. 这可以是一个index.php处理所有传入请求的文件(这是框架中最常见的模式,Laravel 也是如此:https ://github.com/laravel/laravel/blob/8e5510458e1a4c0bf4b78024d9b0cf56102c8207/public/index.php#L34 )或您将包含在处理请求的所有文件中的其他文件.php(如果您不使用 common index.php)。

如果您想了解有关框架如何工作的更多信息,我建议您浏览并阅读他们的代码。您可以从较小的东西开始(例如 Slim)。


稍后编辑 - 虚拟教程:

好吧,让我们构建一个非常基本的项目:

步骤 1.我们从以下内容开始:

作曲家.json

{
    "name": "example/project",
    "type": "project",
    "require": {
        "vlucas/phpdotenv": "^5.3"
    }
}
Run Code Online (Sandbox Code Playgroud)

索引.php

<?php

use Dotenv\Dotenv;

require __DIR__.'/vendor/autoload.php';

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

echo 'Hello world!';
var_dump($_ENV);
Run Code Online (Sandbox Code Playgroud)

.env

SAMPLE_ENV_VAR = some_value
Run Code Online (Sandbox Code Playgroud)

运行后的文件结构composer install

project_root_folder/
 - vendor/
 - .env
 - composer.json
 - composer.lock
 - index.php
Run Code Online (Sandbox Code Playgroud)

在这种状态下,当您在浏览器中访问您的index.php时(假设http://localhost/或http://localhost/index.php),它应该运行而不会出现错误,并且您还应该看到我们的自定义环境变量已在文件中声明.env


步骤2.添加基本路由:

索引.php

<?php

use Dotenv\Dotenv;

require __DIR__.'/vendor/autoload.php';

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Figure out the requested page; fallback to the home page.
$page = $_GET['page'] ?? 'Home';

if ($page == 'Home') {
    echo 'This is the home page.';
}
elseif ($page == 'Books/index') {
    echo 'This is the books index page.';
}
elseif ($page == 'Books/detail') {
    echo 'This is the detail page for book with ID: ' . $_GET['book_id'];
}
else {
    echo 'NOT FOUND :(';
}
Run Code Online (Sandbox Code Playgroud)

如果您现在访问 http://localhost/ 或 http://localhost/index.php 或 http://localhost/index.php?page=Home,您应该会看到主页。如果您访问http://localhost/index.php?page=Books/index,您应该看到书籍索引页面等等...


步骤 3.将页面逻辑移出到单独的控制器: index.php

<?php

use Dotenv\Dotenv;

require __DIR__.'/vendor/autoload.php';

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Figure out the requested page; fallback to the home page.
$page = $_GET['page'] ?? 'Home';

// We require the necessary controller class file and call its appropriate method:
if ($page == 'Home') {
    require __DIR__.'/src/controllers/Home.php';
    (new Home())->index();
}
elseif ($page == 'Books/index') {
    require __DIR__.'/src/controllers/Books.php';
    (new Books())->index();
}
elseif ($page == 'Books/detail') {
    require __DIR__.'/src/controllers/Books.php';
    (new Books())->detail();
}
else {
    echo 'NOT FOUND :(';
}
Run Code Online (Sandbox Code Playgroud)

src/Controllers/Home.php

<?php

class Home
{
    public function index()
    {
        echo 'This is the home page.';
    }
}
Run Code Online (Sandbox Code Playgroud)

src/Controllers/Books.php

<?php

class Books
{
    public function index()
    {
        echo 'This is the books index page.';
    }

    public function detail()
    {
        echo 'This is the detail page for book with ID: ' . $_GET['book_id'];
    }
}
Run Code Online (Sandbox Code Playgroud)

新的文件结构:

project_root_folder/
 - src/
   - Controllers/
     - Home.php
     - Books.php
 - vendor/
 - .env
 - composer.json
 - composer.lock
 - index.php
Run Code Online (Sandbox Code Playgroud)

步骤 4.使用 Composer 和 PSR-4 自动加载(为了摆脱手动要求):

请注意文件的添加composer.json和命名空间.php

作曲家.json

{
    "name": "example/project",
    "type": "project",
    "require": {
        "vlucas/phpdotenv": "^5.3"
    },
    "autoload": {
        "psr-4": {
            "Example\\Project\\": "src/"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

确保运行composer dump-autoload以便“应用”上述更改。

src/Controllers/Home.php

<?php

namespace Example\Project\Controllers;

class Home
{
    public function index()
    {
        echo 'This is the home page.';
    }
}
Run Code Online (Sandbox Code Playgroud)

src/Controllers/Books.php

<?php

namespace Example\Project\Controllers;

class Books
{
    public function index()
    {
        echo 'This is the books index page.';
    }

    public function detail()
    {
        echo 'This is the detail page for book with ID: ' . $_GET['book_id'];
    }
}
Run Code Online (Sandbox Code Playgroud)

索引.php

<?php

use Dotenv\Dotenv;

require __DIR__.'/vendor/autoload.php';

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Figure out the requested page; fallback to the home page.
$page = $_GET['page'] ?? 'Home';

if ($page == 'Home') {
    (new \Example\Project\Controllers\Home())->index();
}
elseif ($page == 'Books/index') {
    (new Example\Project\Controllers\Books())->index();
}
elseif ($page == 'Books/detail') {
    (new Example\Project\Controllers\Books())->detail();
}
else {
    echo 'NOT FOUND :(';
}
Run Code Online (Sandbox Code Playgroud)

步骤 5. 动态加载和调用控制器。

索引.php

<?php

use Dotenv\Dotenv;

require __DIR__.'/vendor/autoload.php';

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Figure out the requested page; fallback to the home page.
$page = $_GET['page'] ?? 'Home';

// Figure out the controller name and the method name.
if (strpos($page, '/') === FALSE) {
    $page = $page . '/index';
}
[$controllerName, $method] = explode('/', $page);

$controllerClassName = '\\Example\\Project\\Controllers\\' . $controllerName;

if (class_exists($controllerClassName) && method_exists($controllerClassName, $method)) {
    (new $controllerClassName())->$method();
}
else {
    echo 'NOT FOUND :(';
}
Run Code Online (Sandbox Code Playgroud)

进行此更改后,我们可以引入新的控制器(例如Faq),而无需index.php再进行修改。实现控制器类足以使 http://localhost/index.php?page=Faq URL 正常工作。


... 等等。

上面是一个简单且不完整的路由示例。一个完整的路由机制比这复杂得多,但它可以让你基本了解如何使用composer、自动加载、路由。

  • 我已经用迷你教程编辑了我的回复。 (4认同)