【问题标题】:How to use phpdotenv library on my whole project?如何在我的整个项目中使用 phpdotenv 库?
【发布时间】:2021-09-25 05:34:44
【问题描述】:

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

$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();

我现在如何自动启动它?

【问题讨论】:

    标签: php frameworks autoload phpdotenv


    【解决方案1】:

    通常,您有一个引导文件,其中包含 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 步。 将页面的逻辑移到单独的控制器中: 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 步。动态加载和调用控制器。

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

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


    ...等等。

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

    【讨论】:

    • 我已经创建了 index.php(用它编辑了我的问题)但仍然不知道如何将它用于我的所有项目或如何自动执行它,你能提供一个例子吗?
    • 我已经用一个迷你教程编辑了我的回复。
    猜你喜欢
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多