在引入第三方包时,发现怎么引入都不合理,也不利于扩展。同时之前一直处于边学习边搭建,有的地方不是很合理,所以对代码进行了优化。
下面根据下图顺序贴出框架完整代码。
1、public/index.php,这是web入口文件
<?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 !');
// 引入自定义常量文件
require '../config/define.php';
version_compare(PHALCON_VERSION, '3.0.0', '>') || exit('Require Phalcon > 3.0.0 !');
// 设置时区
date_default_timezone_set('Asia/Shanghai');
NOW_ENV != 'dev' && error_reporting(E_ALL & ~E_NOTICE);
try {
// 引入注册服务
$di = 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();
}
$errorType = 'debug';
} else {
$errorType = 'error';
}
$errorFile = $applicationConfig->$errorType->path;
$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);
}
2、config/define.php,常量定义文件
<?php
// phalcon版本
define('PHALCON_VERSION', Phalcon\Version::get());
//重新命名文件分隔符,建议路径后面加上分隔符
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('NOW_ENV', 'dev');
3、config/config_dev.php,全局开发版配置文件,正式版和测试版只需要拷贝这份,然后进行针对性配置即可。
增加了自动加载配置,默认查找文件的后缀名是php,也可以添加别的,例如class.php。
自动加载机制注册完成会加载files里配置的所有文件
查找类时第一步是查找classes匹配的类,
如果没找到就会在注册的namespaces中查找,优先匹配php后缀文件,如果extensions还设置了class.php后缀,则没有匹配到php后缀的文件就会循环匹配一遍class.php后缀的文件。
如果还未找到就会循环在注册的directories目录下进行匹配。
由于directories匹配性能较低,一般建议使用命名空间注册,尽量不要使用directories注册。
<?php
/**
* @desc 全局配置文件
* @author zhaoyang
* @date 2018年5月3日 下午7:54:47
*/
return [
// 应用配置
'application' => [
'debug' => [
'state' => false,
'path' => BASE_PATH . 'runtime/debug/{YmdH}.log'
],
'error' => [
'path' => BASE_PATH . 'runtime/error/{YmdH}.log'
],
// 自动加载
'loader' => [
// 文件扩展名
'extensions' => [
'php'
],
'classes' => [
'Smarty' => BASE_PATH . 'library/vendors/smarty/Smarty.class.php'
],
'namespaces' => [
'Common' => BASE_PATH . 'common/',
'Library\\Adapter' => BASE_PATH . 'library/adapter/',
'Library\\Extensions' => BASE_PATH . 'library/extensions/',
'Library\\Plugins' => BASE_PATH . 'library/plugins/',
'Library\\Tools' => BASE_PATH . 'library/tools/',
'Library\\Validators' => BASE_PATH . 'library/validators/'
],
'files' => [
],
'directories' => [
]
]
],
// 服务配置
'services' => [
// mysql数据库配置
'db' => [
// 是否记录执行的mysql语句
'logged' => true,
// 记录执行时间超过0秒的mysql语句
'max_execute_time' => 0,
// 比较时间到小数点后几位
'scale' => 5,
'log_path' => BASE_PATH . 'runtime/mysql/{Y/m/d}/{YmdH}.log',
// 使用动态更新
'use_dynamic_update' => true,
// ORM选项配置
'orm_options' => [
// 是否对字段是否为空的判断
'not_null_validations' => false
],
'mysql' => [
'host' => 'localhost',
'port' => 3306,
'username' => 'root',
'password' => '123456',
'dbname' => 'phalcon',
'charset' => 'utf8'
]
],
// 调度器配置
'dispatcher' => [
// 处理 Not-Found错误配置
'notfound' => [
// 错误码及错误提示
'status_code' => 404,
'message' => 'Not Found',
// 错误跳转的页面
'namespace' => DEFAULT_MODULE_NAMESPACE . '\\Controllers',
'controller' => 'error',
'action' => 'error404'
]
],
// volt引擎相关配置
'view_engine_volt' => [
// 编译模板目录
'compiled_path' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/compiled/volt' . DS,
// 是否实时编译
'compile_always' => false,
// 附加到已编译的PHP文件的扩展名
'compiled_extension' => '.php',
// 使用这个替换目录分隔符
'compiled_separator' => '%%',
// 是否要检查在模板文件和它的编译路径之间是否存在差异
'stat' => true,
// 模板前缀
'prefix' => '',
// 支持HTML的全局自动转义
'autoescape' => false
],
// smarty引擎相关配置,直接配置smarty参数
'view_engine_smarty' => [
'compile_dir' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/compiled/smarty' . DS,
'caching' => false,
'cache_lifetime' => 3600,
'cache_dir' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/cache/smarty' . DS
],
// 模板相关配置
'view' => [
// 模板路径
'view_path' => APP_PATH . DEFAULT_MODULE . '/views' . DS,
// 模板引擎,根据模板后缀自动匹配视图引擎,不启用则设为false
'engines' => [
'.volt' => 'viewEngineVolt',
'.phtml' => 'viewEnginePhp',
'.html' => 'viewEngineSmarty'
],
'disable_level' => [
'level_action_view' => false,
'level_before_template' => true,
'level_layout' => true,
'level_after_template' => true,
'level_main_layout' => true
]
],
// 过滤器设置
'filter' => [
// 过滤类型,支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
'default_filter' => 'string,trim'
],
// 文件日志,formatter常用line,adapter常用file
'logger' => [
'line' => [
'format' => '[%date%][%type%] %message%',
'date_format' => 'Y-m-d H:i:s'
],
'file' => [
'alert' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/alert/{Y/m/d}/{YmdH}.log',
'critical' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/critical/{Y/m/d}/{YmdH}.log',
'debug' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/debug/{Y/m/d}/{YmdH}.log',
'error' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/error/{Y/m/d}/{YmdH}.log',
'emergency' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/emergency/{Y/m/d}/{YmdH}.log',
'info' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/info/{Y/m/d}/{YmdH}.log',
'notice' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/notice/{Y/m/d}/{YmdH}.log',
'warning' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/warning/{Y/m/d}/{YmdH}.log'
]
],
// session配置
'session' => [
// 是否自动开启 SESSION
'auto_start' => true,
'options' => [
'adapter' => 'files',
'unique_id' => DEFAULT_MODULE
]
// @formatter:off
/* // phalcon提供了四种适配器,分别是files、memcache、redis、libmemcached
'options' => [
'adapter' => 'memcache',
'unique_id' => DEFAULT_MODULE,
'prefix' => DEFAULT_MODULE,
'persistent' => true,
'lifetime' => 3600
],
'options' => [
'adapter' => 'redis',
'unique_id' => DEFAULT_MODULE,
'prefix' => DEFAULT_MODULE,
'auth' => '',
'persistent' => false,
'lifetime' => 3600,
'index' => 1
] */
// @formatter:on
],
// 加密配置
'crypt' => [
// 加密秘钥
'key' => DEFAULT_MODULE,
// 填充方式,默认是0(PADDING_DEFAULT),1(PADDING_ANSI_X_923)、2(PADDING_PKCS7)、3(PADDING_ISO_10126)、4(PADDING_ISO_IEC_7816_4)、5(PADDING_ZERO)、6(PADDING_SPACE)
'padding' => '',
// 加密方法,默认是"aes-256-cfb"
'cipher' => ''
],
// cookies配置
'cookies' => [
// 是否使用加密,使用加密必须要设置crypt 的key值
'use_encryption' => true
],
// 缓存配置
'cache' => [
'frontend' => [
// 数据处理方式,支持data(序列化)、json、base64、none、output、igbinary、msgpack
'data' => [
'lifetime' => 172800
],
'output' => [
'lifetime' => 172800
]
],
'backend' => [
// 数据缓存方式,支持memcache、file、redis、mongo、apc、apcu、libmemcached、memory、xcache
'file' => [
'cache_dir' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/cache/',
// 对保存的键名进行md5加密
'safekey' => true,
'prefix' => ''
],
'memcache' => [
'host' => 'localhost',
'port' => '11211',
'persistent' => false,
'prefix' => '',
// 默认情况下禁用对缓存键的跟踪
'stats_key' => ''
],
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'auth' => '',
'persistent' => false,
'prefix' => '',
'stats_key' => '',
'index' => 0
]
]
],
// 模型元数据缓存配置
'models_metadata' => [
'options' => [
// 适配器,默认使用memory(内存),还支持apc、apcu、files、libmemcached、memcache、redis、session、xcache
'adapter' => 'files',
'meta_data_dir' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/models_metadata/'
]
// @formatter:off
/* 'options' => [
'adapter' => 'files',
'meta_data_dir' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/models_metadata/'
],
'options' => [
'adapter' => 'memcache',
'unique_id' => DEFAULT_MODULE,
'prefix' => DEFAULT_MODULE,
'persistent' => true,
'lifetime' => 3600
],
'options' => [
'adapter' => 'memory',
],
'options' => [
'adapter' => 'redis',
'unique_id' => DEFAULT_MODULE,
'prefix' => DEFAULT_MODULE,
'auth' => '',
'persistent' => false,
'lifetime' => 3600,
'index' => 1
],
'options' => [
'adapter' => 'session',
'prefix' => DEFAULT_MODULE,
] */
// @formatter:on
],
// 模型缓存配置
'models_cache' => [
'frontend' => [
'adapter' => 'data',
'lifetime' => 86400
],
'backend' => [
'adapter' => 'file',
'cache_dir' => BASE_PATH .