在项目开发维护中,一般情况下会有三种环境,分别是开发环境、测试环境、生产环境。开发通常在本地开发,调试好了发布到测试环境由测试人员测试。测试用过后适时发布到生产环境。所以一般需要有三套配置文件。我喜欢分别命名为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
对应的常量值即可