首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在我的整个项目中使用phpdotenv库?

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

Stack Overflow用户
提问于 2021-07-16 11:52:23
回答 1查看 1.3K关注 0票数 2

我使用composer启动了一个项目,并捐助了vlucas/phpdotenv包。例如,我想在整个项目中调用$_ env‘’name‘,而不需要像这样在每个类中实例化点env:

代码语言:javascript
复制
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

例如,我如何才能像laravel框架那样实现这一点?

另一个问题是我很难,我需要导入我的自动require __DIR__.'/../vendor/autoload.php';来调用use Dotenv\Dotenv;.

在我的类中,如何不用需要自动加载就可以使用Dotenv?

编辑添加的index.php:

代码语言:javascript
复制
<?php

use Dotenv\Dotenv;

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

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

我现在该怎么自动启动它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-16 12:41:16

通常,您有一个引导文件,其中包含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

代码语言:javascript
复制
{
    "name": "example/project",
    "type": "project",
    "require": {
        "vlucas/phpdotenv": "^5.3"
    }
}

index.php

代码语言:javascript
复制
<?php

use Dotenv\Dotenv;

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

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

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

.env

代码语言:javascript
复制
SAMPLE_ENV_VAR = some_value

运行composer install后的文件结构

代码语言:javascript
复制
project_root_folder/
 - vendor/
 - .env
 - composer.json
 - composer.lock
 - index.php

在这种状态下,当您在浏览器中访问您的index.php (比如http://localhost/http://localhost/index.php)时,它应该没有错误地运行,您还应该看到我们在.env文件中声明的自定义env。

步骤2.添加基本路由:

index.php

代码语言:javascript
复制
<?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.phphttp://localhost/index.php?page=Home,您应该会看到主页。如果您访问http://localhost/index.php?page=Books/index,您应该会看到图书索引页面等等.

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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?php

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

src/Controllers/Books.php

代码语言:javascript
复制
<?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'];
    }
}

新的文件结构:

代码语言:javascript
复制
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

代码语言:javascript
复制
{
    "name": "example/project",
    "type": "project",
    "require": {
        "vlucas/phpdotenv": "^5.3"
    },
    "autoload": {
        "psr-4": {
            "Example\\Project\\": "src/"
        }
    }
}

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

src/Controllers/Home.php

代码语言:javascript
复制
<?php

namespace Example\Project\Controllers;

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

src/Controllers/Books.php

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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、自动加载、路由的基本理解。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68408564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档