Larvae的配置都在config目录下非常方便管理,可以通过 config()
帮助函数来实现对配置项目的设置和获取,同时用 DotEnv 来实现项目内环境变量的控制,非常强大和方便。我们在日常开发中如果没有使用Laravel框架,比如写一些脚本,或者自己写的项目框架,但是想集成这样的配置管理。这里就讲讲如何集成 illuminate/config
到自己的项目中实现Laravel那种config配置。
illuminate/config
和 vlucas/phpdotenv
,composer.json如下: { "require": { "illuminate/config": "^5.2", "vlucas/phpdotenv": "^2.3" }, "autoload": { "psr-4": { "App//": "app/" } } }
.env
里面只写入当前环境,比如 local
, develop
, production
.local.env
表示本地开发环境的配置项 .develop.env
表示测试环境的配置项 .production
表示生产环境的配置项 关于Laravel在不同环境加载不同配置的方法可以参考我的这篇文章《 Laravel在不同的环境调用不同的配置文件 》
我们在新建一个配置文件,比如 config/app.php 或者 config/path/to.php
加载配置文件,新建 app/Config.php
<?php namespace App; use Illuminate/Config/Repository; use Illuminate/Filesystem/Filesystem; class Config extends Repository { public function loadConfigFiles($path) { $fileSystem = new Filesystem(); if (!$fileSystem->isDirectory($path)) { return; } foreach ($fileSystem->allFiles($path) as $file) { $relativePathname = $file->getRelativePathname(); $pathInfo = pathinfo($relativePathname); if ($pathInfo['dirname'] == '.') { $key = $pathInfo['filename']; } else { $key = str_replace('/', '.', $pathInfo['dirname']) . '.' . $pathInfo['filename']; } $this->set($key, require $path . '/' . $relativePathname); } } }
Config
继承 Repository
, Repository
中主要是对配置的操作,我们实现了自己的 loadConfigFiles
方法,该方法用来加载我们前面 config
目录下面所有的配置文件(包括层级),并用 .
分格目录来设置配置项
Dotenv
来将 .*.env
中的配置项目加载到环境变量,以至于在配置文件中可以通过 getenv()
来获取,新建app/Application.php: <?php namespace App; use Illuminate/Filesystem/Filesystem; class Application { public $config; public $fileSystem; public $environment; public function __construct()tong { $this->config = new Config(); $this->fileSystem = new Filesystem(); $this->environment = $this->getEnvironment(); $this->config->loadConfigFiles(__DIR__ . '/../config'); } public function getEnvironment() { $environment = ''; $environmentPath = __DIR__ . '/../.env'; if ($this->fileSystem->isFile($environmentPath)) { $environment = trim($this->fileSystem->get($environmentPath)); $envFile = __DIR__ . '/../.' . $environment; if ($this->fileSystem->isFile($envFile . '.env')) { $dotEnv = new /Dotenv/Dotenv(__DIR__ . '/../', '.' . $environment . '.env'); $dotEnv->load(); } } return $environment; } }
这里主要做了两件事: 实例化Config,并加载config目录下面所有的配置 和 getEnvironment
方法通过 Dotenv
的 load
方法来加载 .*.env
中的配置项目到环境变量
<?php require __DIR__.'/../vendor/autoload.php';
<?php return new /App/Application();
config/app.php <?php return [ 'test' => getenv('TEST') ]; .env local .local.env TEST='this is local test' .develop.env TEST='this is develop test' .production.env TEST='this is production test'
<?php require __DIR__.'/bootstrap/autoload.php'; $app = require_once __DIR__.'/bootstrap/app.php'; var_dump($app->config->get('app.test'));
php index.php
可以正确输出 "this is local test" ,当然你可以 .env
中写入的是develop的话会输出 "this is develop test" 这样就实现了集成 illuminate/config
和 Dotenv
到我们自己项目中,以上内容只是演示,具体可以根据自己项目需要和个人编码爱好改写,本文示例代码请戳: https://github.com/yuansir/app-config
转载请注明:转载自 Ryan是菜鸟 | LNMP技术栈笔记