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 技术栈笔记

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

谢谢打赏

本文链接地址: 非 Laravel 项目中集成使用 illuminate/config

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可