在項目開發維護中,一般情況下會有三種環境,分別是開發環境、測試環境、生產環境。開發通常在本地開發,調試好了發佈到測試環境由測試人員測試。測試用過後適時發佈到生產環境。所以一般需要有三套配置文件。我喜歡分別命名爲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
對應的常量值即可