ed-fruty / php-environment
PHP环境包装器,用于加载环境变量(支持json、php、ini、xml、yml和序列化数据格式)
Requires
- php: >=5.3.0
Suggests
- symfony/yaml: To use YmlReader install symfony/yaml component
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_get
和envGet
。它们是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');
将不会工作。对于$_ENV
和getenv
函数,只有定义的第一级(在点'. '之前)才会生效。并且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添加到您的本地计算机?
环境文件不存在?
默认情况下,如果环境文件不存在,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 示例
- 创建一个内容相同的文件
env.json
{ "database" : { "connection" : { "host" : "localhost", "username" : "root", "password" : "mySuperPassword", "port" : "3310" } } }
- 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'json');
- 使用它。
echo Env::instance('database.connection.host'); // will print 'localhost'
Ini Reader 示例
- 创建一个内容相同的文件
env.ini
appName=My Application Name ;commentedVariable=Value [database_connection] host=localhost username=root password=MySupperPassword port=3306
- 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'ini');
- 使用它。
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 示例
- 创建一个内容相同的文件
env.php
<?php return [ 'appName' => 'My Application Name', 'services' => [ 'database' => [ 'connection_default' => [ 'host' => 'localhost', 'username' => 'root', 'password' => 'meGaPaSsword' ] ] ] ];
- 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'php');
- 使用它。
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 示例
- 创建一个内容相同的文件
env.xml
<?xml version="1.0"?> <root> <database> <connection> <host>localhost</host> <database>db_name</database> <username>custom_user</username> </connection> </database> </root>
- 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'xml');
- 使用它。
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 示例
- 创建一个内容相同的文件
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";}}}}
- 加载环境文件
Env::isntance()->load(__DIR__, 'env', 'serialize');
- 使用它。
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.yml
或env.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'