ed-fruty/php-environment

PHP环境包装器,用于加载环境变量(支持json、php、ini、xml、yml和序列化数据格式)

dev-master 2015-02-20 11:59 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:29:03 UTC


README

PHP环境包装器,用于加载环境变量(支持json、php、ini、xml、yml和序列化数据格式)

为什么选择ed-fruty/php-environment?

你永远不应该在代码中存储敏感凭证。在环境中存储配置十二要素应用的一个原则。任何可能在部署环境之间变化的东西(如数据库凭证或第三方服务的凭证)都应该从代码中提取出来,作为环境变量。

基本上,环境文件是一种简单的方式来加载应用程序所需的自定义配置变量,而无需修改.htaccess文件或Apache/nginx虚拟主机。这意味着你不必编辑项目外的任何文件,无论你如何运行项目 - Apache、Nginx、CLI,甚至是PHP 5.4内置的web服务器。这种方法比你知道的设置环境变量的所有其他方法都要简单,你一定会喜欢的。

  • 无需在Apache或Nginx中编辑虚拟主机
  • 无需将php_value标志添加到.htaccess文件中
  • 轻松的可移植性和共享所需的ENV值
  • 与PHP的内置web服务器和CLI运行器兼容

使用Composer安装

composer require ed-fruty/php-environment

使用方法

环境文件通常不包含在版本控制中,因为它可能包含敏感的API密钥和密码。你可以创建一个示例文件(env.json.example),在其中定义所有必要的环境变量(除了敏感变量,这些变量可能是为各自的开发环境由用户提供的,或者在其他地方与项目协作者进行沟通)。项目协作者随后独立地将环境文件复制到本地env.json中,并确保所有设置对于其本地环境都是正确的,在必要时填写秘密密钥或提供自己的值。在此用法中,应将env.json文件添加到项目的.gitignore文件中,以确保它不会被协作者提交。这种用法确保敏感密码或API密钥永远不会出现在版本控制历史中,从而降低了安全漏洞的风险,并且生产值永远不会与所有项目协作者共享。

将应用程序配置添加到环境文件中的任何位置,但基本上将其放在项目的根目录下。确保环境文件已添加到您的.gitignore中,以便它不会被代码签入

简单示例

创建一个内容相同的env.json文件

{
  "database" : {
    "connection" : {
      "host"      : "localhost",
      "username"  : "root",
      "password"  : "mySuperPassword",
      "port"      : "3310"
    }
  }
}

现在您需要在代码中加载环境配置。

这里我们开始!

use Fruty\Environment\Env;

Env::instance()->load(__DIR__, 'env');

完成了!

env参数是环境文件名。__DIR__是文件所在的路径。默认文件扩展名是json,但您可以使用其他扩展名(见下文)。注意。可能您需要设置一个路径,其中包含您的环境文件,而不是使用__DIR__

现在您可以使用

echo Env::instance()->get('databse.connection.host'); // Will print 'localhost'
var_dump(Env::instance()->get('database.connection'));
/*
 * object(stdClass)#3 (4) {
 *      ["host"]=>
 *      string(9) "localhost"
 *      ["username"]=>
 *      string(4) "root"
 *      ["password"]=>
 *      string(15) "mySuperPassword"
 *      ["port"]=>
 *      string(4) "3310"
 *    }
 */

您可以通过不同的方式访问环境变量。下面的示例是彼此的替代品。

$result = Env::instance('database');
$result = $_ENV['database'];   // global php array, has limits (see below)
$result = getenv('database');  // standart php function, has limits (see below)
$result = env_get('database');
$result = envGet('database');

如您所见,我们使用了包辅助函数env_getenvGet。它们是Env::instance()->get()的简短替代。

获取所有环境变量

$env = Env::instance()->get();

默认值

要获取某些值或设置或设置默认值,将默认值作为第二个参数

$databaseUser = env_get('database.connection.username', 'myDbUser');

以下示例显示,$databaseUser的值将是环境文件的值,如果环境文件中不存在,则默认为'myDbUser'

您还可以使用类似这样的(但不推荐)

echo Env::instance()->get('database')->connection->host; // Will print 'localhost'
echo $_ENV['database']->connection->host; // will print 'localhost'

$_ENV和getenv()的限制

$_ENV['database.connection'];
getenv('database.connection');

将不会工作。对于$_ENVgetenv函数,只有定义的第一级(在点'. '之前)才会生效。并且getenv函数有一个惊喜。PHP只允许我们通过putenv保存标量值,因此以下这样的代码

$result = getenv('database');

不是对象。它将是带有json_encoded值的字符串

数组键不起作用?

注意,关联数组将成为stdClass对象实例

  echo env_get('services')['database']; // Wrong
  echo env_get('services')->database; // Right

自动文件检测

例如,许多公司都有这样的环境方式。每个开发人员都将APP_ENV值设置为其本地计算机,并且环境文件名与相同。例如,我的本地APP_ENV值是dev-fruty,因此下一个脚本将加载dev-fruty.json文件中的变量。

Env::instance()->load(__DIR__, null);

这就是全部。

如何将APP_ENV添加到您的本地计算机?

Windows用户

Ubuntu

Mac

环境文件不存在?

默认情况下,如果环境文件不存在,env_get('key')将返回null,如果设置了默认值,则返回默认值。您可以设置

Env::instance()->fileNotFoundException(true);

如果环境文件不存在,将抛出InvalidArgumentException异常。

必需的变量

您不仅可以设置必须存在的环境文件,还可以设置必需变量定义。

Env::instance()->required([
  'appName',
  'cache',
  'database.connection.charset',
]);

现在如果这些参数之一在您的环境文件中不存在,您将获得RuntimeException

环境读取器

在早期示例中,我们只使用了json格式,但您可以使用以下支持格式

  • JSON
  • XMl
  • INI
  • PHP Array
  • Yml
  • Serialize

您需要什么来使用它?在加载环境时,将读取器名称作为第三个参数

Env::instance()->load(__DIR__, 'env', 'ini');
Env::instance()->load(__DIR__, null, 'xml'); // for auto detecting your envrionment filename

JSON Reader 示例

  1. 创建一个内容相同的文件env.json
{
  "database" : {
    "connection" : {
      "host"      : "localhost",
      "username"  : "root",
      "password"  : "mySuperPassword",
      "port"      : "3310"
    }
  }
}
  1. 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'json');
  1. 使用它。
echo Env::instance('database.connection.host'); // will print 'localhost'

Ini Reader 示例

  1. 创建一个内容相同的文件env.ini
appName=My Application Name

;commentedVariable=Value

[database_connection]
host=localhost
username=root
password=MySupperPassword
port=3306
  1. 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'ini');
  1. 使用它。
var_dump(env_get('database_connection'));

/* class stdClass#7 (4) {
 *  public $host =>
 *  string(9) "localhost"
 *  public $username =>
 *  string(4) "root"
 *  public $password =>
 *  string(16) "MySupperPassword"
 *  public $port =>
 *  string(4) "3306"
 */ }

echo env_get('commentedVariable'); // NULL
echo env_get('appName') // string(19) "My Application Name"

PHP Array Reader 示例

  1. 创建一个内容相同的文件env.php
<?php
return [
    'appName' => 'My Application Name',
    'services' => [
        'database' => [
            'connection_default' => [
                'host' => 'localhost',
                'username'  => 'root',
                'password'  => 'meGaPaSsword'
            ]
        ]
    ]
];
  1. 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'php');
  1. 使用它。
var_dump(env_get('services.database.connection_default'));

/* class stdClass#9 (3) {
 *  public $host =>
 *  string(9) "localhost"
 *  public $username =>
 *  string(4) "root"
 *  public $password =>
 *  string(12) "meGaPaSsword"
 */ }

Xml Reader 示例

  1. 创建一个内容相同的文件env.xml
<?xml version="1.0"?>
<root>
    <database>
        <connection>
            <host>localhost</host>
            <database>db_name</database>
            <username>custom_user</username>
        </connection>
    </database>
</root>
  1. 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'xml');
  1. 使用它。
var_dump(env_get('database.connection'));

/* class stdClass#8 (3) {
 *  public $host =>
 *  string(9) "localhost"
 *  public $database =>
 *  string(7) "db_name"
 *  public $username =>
 *  string(11) "custom_user"
 */ }

Serialize Reader 示例

  1. 创建一个内容相同的文件env.serialize
a:2:{s:7:"appName";s:19:"My Application Name";s:8:"services";a:1:{s:8:"database";a:1:{s:18:"connection_default";a:3:{s:4:"host";s:9:"localhost";s:8:"username";s:4:"root";s:8:"password";s:12:"meGaPaSsword";}}}}
  1. 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'serialize');
  1. 使用它。
var_dump(env_get('services.database.connection_default'));

/* class stdClass#9 (3) {
 *  public $host =>
 *  string(9) "localhost"
 *  public $username =>
 *  string(4) "root"
 *  public $password =>
 *  string(12) "meGaPaSsword"
 */ }

Yaml Reader 示例

要使用yml读取器,您首先需要安装Symfony Yaml组件。所以做

composer require symfony/yaml

接下来,创建一个内容相同的文件env.ymlenv.yaml(在我们的示例中将是env.yaml

database:
  host: localhost
  username: root

加载环境文件

Env::isntance()->load(__DIR__, 'env', 'yaml');

现在使用它。

var_dump(env_get('database'));

/* class stdClass#7 (2) {
 *  public $host =>
 *  string(9) "localhost"
 *  public $username =>
 *  string(4) "root"
 */ }

echo env_get('database.host'); // will print 'localhost'