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对应的常量值即可

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