如何在我的整个项目中使用 phpdotenv 库?
How to use phpdotenv library on my whole project?
我使用 composer 启动了一个项目并下载了包 vlucas/phpdotenv。例如,我想在我的整个项目中调用 $_ENV['name'],而无需像这样在每个 class 中实例化点环境:
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
我怎样才能像 laravel 框架那样实现?
另一个问题是我需要导入我的自动加载 require __DIR__.'/../vendor/autoload.php';
才能调用 use Dotenv\Dotenv;
...
如何在我的 classes 中使用 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. 将页面的逻辑移出到单独的控制器中:
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
。实施控制器 class 足以使 http:///localhost/index.php?page=Faq URL 正常工作。
...等等。
以上是一个简单且不完整的路由示例。一个完整的路由机制比这复杂得多,但它可以让你对如何使用composer、自动加载、路由有基本的了解。
我使用 composer 启动了一个项目并下载了包 vlucas/phpdotenv。例如,我想在我的整个项目中调用 $_ENV['name'],而无需像这样在每个 class 中实例化点环境:
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
我怎样才能像 laravel 框架那样实现?
另一个问题是我需要导入我的自动加载 require __DIR__.'/../vendor/autoload.php';
才能调用 use Dotenv\Dotenv;
...
如何在我的 classes 中使用 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. 将页面的逻辑移出到单独的控制器中: 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
。实施控制器 class 足以使 http:///localhost/index.php?page=Faq URL 正常工作。
...等等。
以上是一个简单且不完整的路由示例。一个完整的路由机制比这复杂得多,但它可以让你对如何使用composer、自动加载、路由有基本的了解。