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

本文最早发表于本人博客:  非Laravel项目中集成使用 illuminate/config

Laravel的配置都在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技术栈笔记

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

谢谢打赏

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 7年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9
Summer

:+1: 好文章,已加精。

又一个学习 Laravel 的好处,illuminate 的包都可以灵活的在非 Laravel 环境下使用。

7年前 评论
Ryan

@Summer 是呢,所以illuminate包搞点出来自己可以弄个轻量级框架了

7年前 评论

这个示例非常不错,简单明了

7年前 评论
Ryan

@maxincai :ok_hand:

7年前 评论

很棒的一篇

7年前 评论

:+1: 谢谢你

7年前 评论

Laravel 确实够灵活 拆出来一小块都能用

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!