转载

非Laravel项目中集成使用 illuminate/config

Larvae的配置都在config目录下非常方便管理,可以通过 config() 帮助函数来实现对配置项目的设置和获取,同时用  DotEnv 来实现项目内环境变量的控制,非常强大和方便。我们在日常开发中如果没有使用Laravel框架,比如写一些脚本,或者自己写的项目框架,但是想集成这样的配置管理。这里就讲讲如何集成 illuminate/config 到自己的项目中实现Laravel那种config配置。

  • 首先通过composer来安装 illuminate/configvlucas/phpdotenv ,composer.json如下:
{       "require": {           "illuminate/config": "^5.2",           "vlucas/phpdotenv": "^2.3"       },       "autoload": {           "psr-4": {               "App//": "app/"           }       }   }
  • 创建.env文件,同时创建对应环境的env文件,为了解决不同环境加载不同配置的问题。比如:
    • .env 里面只写入当前环境,比如 localdevelop , 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 继承 RepositoryRepository 中主要是对配置的操作,我们实现了自己的 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 方法通过 Dotenvload 方法来加载 .*.env 中的配置项目到环境变量

  • 引入autoload.php 新建 bootstrap/autoload.php
<?php    require __DIR__.'/../vendor/autoload.php';
  • 实例化Application
<?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'
  • 在项目跟目录下面新建一个执行文件,比如index.php:
<?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/configDotenv 到我们自己项目中,以上内容只是演示,具体可以根据自己项目需要和个人编码爱好改写,本文示例代码请戳: https://github.com/yuansir/app-config

转载请注明:转载自 Ryan是菜鸟 | LNMP技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

原文  https://yuansir-web.com/2016/07/20/fei-laravelxiang-mu-zhong-ji-cheng-shi-yong-illuminate-config/
正文到此结束
Loading...