非 Laravel 專案中整合使用 illuminate/config

Ryan發表於2016-07-21

本文最早發表於本人部落格:  非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 協議》,轉載必須註明作者和本文連結

相關文章