Phalcon搭建多模塊框架二十六:設置開發環境、測試環境、生產環境配置文件

在項目開發維護中,一般情況下會有三種環境,分別是開發環境、測試環境、生產環境。開發通常在本地開發,調試好了發佈到測試環境由測試人員測試。測試用過後適時發佈到生產環境。所以一般需要有三套配置文件。我喜歡分別命名爲config_dev.php(開發環境配置)、config_test.php(測試環境配置)、config_pro.php(生產環境配置)。
這裏寫圖片描述
1、將原來config下的config.php文件複製兩份,再將這三份文件分別命名爲config_dev.php(開發環境配置)、config_test.php(測試環境配置)、config_pro.php(生產環境配置)。
2、將原來app/home/config下的config.php文件複製兩份,再將這三份文件分別命名爲config_dev.php(開發環境配置)、config_test.php(測試環境配置)、config_pro.php(生產環境配置)。
3、打開入口文件public/index.php,添加和修改

// 添加,
define('CONFIG_FILE_NAME', 'config_dev.php');
// 修改
 $config = require BASE_PATH . 'config/' . CONFIG_FILE_NAME;

因爲一旦發佈到測試環境或者生產環境,入口文件基本不會再修改,所以可以再svn等版本控制軟件中忽略此文件的提交。發佈到不同的環境只需要修改入口文件的常量CONFIG_FILE_NAME對應的常量值即可。同時去掉error_reporting(E_ALL & ~E_NOTICE);的註釋,開發中還是要註釋掉,以便報出任何錯誤提示信息。
完整的public/index.php

<?php
/**
 * @desc 入口文件
 * @author zhaoyang
 * @date 2018年5月3日 下午5:16:27
 */
use \Phalcon\Mvc\Application;

// 檢查版本,搭建用到php7一些新特性
version_compare(PHP_VERSION, '7.0.0', '>') || exit('Require PHP > 7.0.0 !');
extension_loaded('phalcon') || exit('Please open the Phalcon extension !');

// phalcon版本
define('PHALCON_VERSION', Phalcon\Version::get());

version_compare(PHP_VERSION, '3.0.0', '>') || exit('Require Phalcon > 3.0.0 !');

// 設置時區
date_default_timezone_set('Asia/Shanghai');

//重新命名文件分隔符,建議路徑後面加上分隔符
define('DS', DIRECTORY_SEPARATOR);

// 應用程序名稱(應用程序所在目錄名)
define('APP_NAME', 'app');

// 頂級命名空間
define('APP_NAMESPACE', 'App');

// 項目根目錄
define('BASE_PATH', dirname(__DIR__) . DS);

// 應用程序所在目錄
define('APP_PATH', BASE_PATH . APP_NAME . DS);

// 模塊列表
// @formatter:off
define('MODULE_ALLOW_LIST', ['home', 'admin']);
// @formatter:on

// 默認模塊
define('DEFAULT_MODULE', 'home');

// 默認模塊命名空間
define('DEFAULT_MODULE_NAMESPACE', APP_NAMESPACE . '\Home');

// 默認使用的配置文件名
define('CONFIG_FILE_NAME', 'config_dev.php');

// error_reporting(E_ALL & ~E_NOTICE);

try {
    // 引入配置文件
    $config = require BASE_PATH . 'config/' . CONFIG_FILE_NAME;

    // 引入自動加載配置
    require BASE_PATH . 'config/loader.php';

    // 引入路由規則
    $routerRules = require BASE_PATH . 'config/routers.php';

    // 引入註冊服務
    require BASE_PATH . 'config/services.php';

    // 處理請求
    $application = new Application($di);

    // 組裝應用程序模塊
    $modules = [ ];
    foreach (MODULE_ALLOW_LIST as $v) {
        $modules[$v] = [ 
            'className' => APP_NAMESPACE . '\\' . ucfirst($v) . '\Module',
            'path' => APP_PATH . $v . '/Module.php'
        ];
    }
    // 加入模塊分組配置
    $application->registerModules($modules);

    // 輸出請求內容
    echo $application->handle()->getContent();
} catch (\Throwable $e) {
    $previous = $e->getPrevious();
    $applicationConfig = $application->config->application;
    if ($applicationConfig->debug->state ?? false) {
        if (empty($applicationConfig->debug->path)) {
            echo 'Exception: <br/>', '所在文件:', $e->getFile(), '<br/>所在行:', $e->getLine(), '<br/>錯誤碼:', $e->getCode(), '<br/>錯誤消息:', $e->getMessage();
            if (!is_null($previous)) {
                echo '<br/>前一個Exception: <br/>', '所在文件:', $previous->getFile(), '<br/>所在行:', $previous->getLine(), '<br/>錯誤碼:', $previous->getCode(), '<br/>錯誤消息:', $previous->getMessage();
            }
            exit();
        }
        $errorFile = $applicationConfig->debug->path;
        $errorType = 'debug';
    } else {
        $errorFile = $applicationConfig->error->path;
        $errorType = 'error';
    }
    $errorMessage = 'Exception: [所在文件:' . $e->getFile() . '] [所在行:' . $e->getLine() . '] [錯誤碼:' . $e->getCode() . '] [錯誤消息:' . $e->getMessage() . '] '/*  . PHP_EOL . '[異常追蹤信息:' . $e->getTraceAsString() . ']' */;
    if (!is_null($previous)) {
        $errorMessage .= '  前一個Exception: [所在文件:' . $previous->getFile() . '] [所在行:' . $previous->getLine() . '] [錯誤碼:' . $previous->getCode() . '] [錯誤消息:' . $previous->getMessage() . '] '/*  . PHP_EOL . '[異常追蹤信息:' . $previous->getTraceAsString() . ']' */;
    }
    $application->di->get('logger', [$errorFile])->$errorType($errorMessage);
}

4、打開app/home下的Module.php文件,修改

private static $_configPath = __DIR__ . '/config/' . CONFIG_FILE_NAME;

完整的app/home下的Module.php

<?php
/**
 * @desc 模塊配置
 * @author zhaoyang
 * @date 2018年5月3日 下午8:49:49
 */
namespace App\Home;

use Phalcon\DiInterface;
use Phalcon\Loader;
use Phalcon\Mvc\ModuleDefinitionInterface;
use Phalcon\Config\Adapter\Php as ConfigAdapterPhp;

class Module implements ModuleDefinitionInterface {

    // 模塊配置文件目錄
    private static $_configPath = __DIR__ . '/config/' . CONFIG_FILE_NAME;

    // 默認需要註冊的命名空間
    private static $_defaultRegisterNamespaces = [
        __NAMESPACE__ . '\\Controllers' => __DIR__ . '/controllers/',
        __NAMESPACE__ . '\\Models' => __DIR__ . '/models/'
    ];

    public function registerAutoloaders(DiInterface $di = NULL) {
        $this->registerConfigService($di);
        $config = $di->getConfig();
        $loader = new Loader();
        $nameSpaces = isset($config->module_namespaces) ? $config->module_namespaces->toArray() : self::$_defaultRegisterNamespaces;
        $loader->registerNamespaces($nameSpaces)->register();
    }

    public function registerServices(DiInterface $di) {
        // 註冊配置文件服務,合併主配置和模塊配置
        $this->registerConfigService($di);
    }

    /**
     * @desc 註冊配置服務
     * @author zhaoyang
     * @date 2018年5月3日 下午8:50:51
     */
    private function registerConfigService(DiInterface $di) {
        $config = $di->getConfig();
        $di->setShared('config', function () use ($config) {
            $moduleConfigPath = self::$_configPath;
            if (is_file($moduleConfigPath)) {
                $override = new ConfigAdapterPhp($moduleConfigPath);
                $config->merge($override);
            }
            return $config;
        });
    }
}

至此,項目就支持三種環境切換了,只需要更改入口文件中的常量CONFIG_FILE_NAME對應的常量值即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章