php - 如何在我的整个项目中使用 phpdotenv 库?

标签 php frameworks autoload phpdotenv

我使用 composer 开始了一个项目,并加载了包 vlucas/phpdotenv。例如,我想在我的整个项目中调用 $_ENV['name'],而无需像这样在每个类中实例化点环境:

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

我怎样才能像 laravel 框架那样实现它?

另一个问题是我需要导入我的自动加载 require __DIR__.'/../vendor/autoload.php'; 以便调用 use Dotenv\Dotenv;...

在我的类中没有要求自动加载的情况下,我如何使用 Dotenv?

编辑添加了 index.php:

<?php

use Dotenv\Dotenv;

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

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

我现在如何自动启动它?

最佳答案

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

如果您想详细了解框架的工作原理,我建议您浏览并阅读他们的代码。您可以从较小的东西开始(例如 Slim)。


后期编辑 - 虚拟教程:

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

第 1 步。我们从以下内容开始:

composer.json

{
    "name": "example/project",
    "type": "project",
    "require": {
        "vlucas/phpdotenv": "^5.3"
    }
}

index.php

<?php

use Dotenv\Dotenv;

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

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

echo 'Hello world!';
var_dump($_ENV);

.env

SAMPLE_ENV_VAR = some_value

运行 composer install 后的文件结构:

project_root_folder/
 - vendor/
 - .env
 - composer.json
 - composer.lock
 - index.php

鉴于此状态,当您在浏览器中访问您的 index.php(假设为 http://localhost/或 http://localhost/index.php)时,它应该可以正常运行并且您还应该看到自定义的我们在 .env 文件中声明的环境变量。


第 2 步。 添加基本路由:

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';

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 :(';
}

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


第 3 步。将页面的逻辑移出到单独的 Controller 中: 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 :(';
}

src/Controllers/Home.php

<?php

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

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'];
    }
}

新的文件结构:

project_root_folder/
 - src/
   - Controllers/
     - Home.php
     - Books.php
 - vendor/
 - .env
 - composer.json
 - composer.lock
 - index.php

第 4 步。利用 composer 和 PSR-4 自动加载(为了摆脱手动要求):

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

composer.json

{
    "name": "example/project",
    "type": "project",
    "require": {
        "vlucas/phpdotenv": "^5.3"
    },
    "autoload": {
        "psr-4": {
            "Example\\Project\\": "src/"
        }
    }
}

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

src/Controllers/Home.php

<?php

namespace Example\Project\Controllers;

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

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'];
    }
}

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';

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 :(';
}

第 5 步。动态加载和调用 Controller 。

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';

// 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 :(';
}

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


...等等。

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

关于php - 如何在我的整个项目中使用 phpdotenv 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68408564/

相关文章:

python - Django:类似于 eBay 的购物网站

php - Composer psr-4 自动加载问题

php - CURLOPT_FILE、curl_multi_exec 和 fclose

php - 从 PHP 中的字符串中识别日期格式

php - 如何防止php simplexml中的自闭标签

java - 如何在列表框zk中添加条件复选框

Spring 3.0.5 不评估属性中的 @Value 注释

java - 不使用短信网关从网站向手机发送短信

zend-framework - 在 Zend_Framework 中自动加载 Symfony 类

php - Composer 不为库生成自动加载