简介
你正在阅读的是 Epigenetic 后生 v1.0版本 的文档!感谢您选择使用我们的框架,让我们一起共同进步吧...
# 什么是Epigenetic 后生?
- 我们的框架中文名为"后生",英文为"Epigenetic",寓意为框架界的晚辈,我们还需学习前辈们的优点逐渐成长。
# 我们的优点?
- 这是一个全开源框架,我们允许用户在符合协议的基础上自行修改框架代码。
- 简单易上手是我们设计框架的主要思路,我们希望用户能够快速上手框架。
- 核心框架设计为轻量级,我们希望按需下载框架,从而提高用户体验。
快速上手指南
本指南将帮助您快速了解如何使用 Epigenetic 后生框架。
# 下载框架
通过访问 Epigenetic 官网,点击下载按钮获取最新版本的框架压缩包(ZIP 文件)。
# 框架部署
将下载的 ZIP 文件解压,并将解压后的文件夹部署到 Nginx 的网站目录中,例如:
/var/www/html/your-project-folder
# 设置伪静态
为了确保框架正常运行,请在 Nginx 配置文件中添加以下伪静态规则:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
完成配置后,重新加载 Nginx 服务以使更改生效:
sudo systemctl reload nginx
# 目录结构
框架根目录
├─index.php 入口文件 [框架文件]
│
├─function 公共方法目录 [框架目录]
│ ├─xxxx xxxx公共方法目录 [自定义目录]
│ │ └─xxxx.php 示例xxxx公共方法文件 [自定义文件]
│ └─public 全局公共方法目录 [框架文件]
│ └─myserver.php 服务器信息获取函数 [框架文件]
│
├─cache 视图缓存目录 [框架目录]
├─view_functions 视图标签目录 [框架目录]
├─class 公共操作类目录 [框架目录]
│ ├─Template.php 视图显示类 [框架文件]
│ └─Sql.php 数据库操作类 [框架文件]
│
├─controller 公共控制器目录 [框架目录]
│ ├─routing.php 路由控制器 [框架文件]
│ ├─login.php 登陆中间件控制器 [框架文件]
│ └─function 公共方法管理控制器 [框架文件]
│
├─data 全局配置等杂项目录 [框架目录]
│ ├─logs 框架日志目录 [框架目录]
│ ├─session 框架session目录 [框架目录]
│ ├─404.php 全局404页面 [框架文件]
│ ├─login.php 登陆中间件配置文件 [框架文件]
│ ├─sql.php 数据库配置文件 [框架文件]
│ ├─key.php 用户密钥文件 [框架文件]
│ └─config.php 全局配置文件 [框架文件]
│
├─app 应用实际目录 [框架目录]
│ ├─xxxx xxxx应用目录 [自定义目录]
│ │ └─xxxx.php xxxx应用文件 [自定义文件]
│ └─developer 开发者应用目录 [框架目录]
│ └─index.php 开发者应用文件 [框架文件]
│
├─theme 视图页面目录 [框架目录]
│ ├─xxxx xxxx应用视图目录 [自定义目录]
│ │ └─xxxx.php xxxx应用对应的视图 [自定义文件]
│ └─developer 开发者应用视图目录 [框架目录]
│ └─index.php 开发者用于显示的页面 [框架文件]
后生目录结构演示
# 说明
- index.php:框架的入口文件,负责加载核心逻辑。
- function/:存放公共方法,分为应用公共方法和全局方法。
- class/:存放公共操作类,如数据库操作类。
- controller/:存放公共控制器,如路由控制器和方法管理控制器。
- data/:存放全局配置文件和其他杂项。
- app/:存放实际应用的代码。
- theme/:存放视图文件,与 app 对应的应用视图。
初识配置文件
这个配置文件是框架的核心配置文件,它包含了框架的基础配置项,开发者模式配置项,路由配置项等,非常重要!开发前请仔细阅读。
# 配置文件代码
// data/config.php
return [
/* 基础配置项 */
'Default_app' => 'developer', // 默认顶级应用名称
'View_display' => true, // 是否开启视图模式 (true: 开启,false: 关闭)
'Global_404' => true, // 是否开启全局 404 视图
'Sql' => 'null', // 数据库模式:'sql' 表示单数据库,'sqls' 表示多数据库,null 表示不使用数据库,数据库配置文件data/sql.php
/*开发者相关配置*/
'Developer_mode' => true, // 开发者模式(true: 开启,false: 关闭,生产力环境请关闭该模式)
'Debug' => true, // 是否开启调试模式(true: 显示错误信息,false: 隐藏错误信息)
/* 路由相关配置项 */
'Routing_suffix' => 'easy', // 路由后缀,默认为空,可以设置为 'html'
'Routing_login' => true, // 是否登陆中间件 (true: 开启,false: 关闭),登陆中间件配置文件 data/login.php
/* 视图相关配置项 */
'Show_cache' => false, // 是否缓存视图 (true: 开启,false: 关闭,会在cache目录生成缓存视图文件,可以有效提高视图的效率)
'View_channels' => false, // 是否开启视图互通模式(true: 允许,false: 不允许)
'View_security' => 'null', // 视图文件安全检查模式 (null: 不限制,forbid: 禁止模式[仅禁止使用指定的函数],allow:允许模式[仅允许使用指定的函数])
'View_safe_array' => ['include', 'if',],
// 允许的函数列表,用户可用自行决定增删
];
配置项文件代码
# 基础配置项
'Default_app' => 'developer', // 默认顶级应用名称
'View_display' => true, // 是否开启视图模式 (true: 开启,false: 关闭)
'Global_404' => true, // 是否开启全局 404 视图
'Sql' => 'null', // 数据库模式:'sql' 表示单数据库,'sqls' 表示多数据库,null 表示不使用数据库,数据库配置文件data/sql.php
基础配置项
- Default_app:默认顶级应用名称,当用户访问网站未指定应用时则默认使用此名称,例如当配置为user,则访问http://你的域名.com/时,则访问的是user应用下的index.php文件。
- View_display:是否开启视图模式,当开启时,框架会加载视图文件;当关闭时,框架不会产生前端页面,常用于纯后端开发。
- Global_404:是否开启全局 404 视图,当开启时,当出错时框架会自动加载404页面;当关闭时,框架会直接返回错误信息。
- Sql:指定数据库模式,'sql' 表示单数据库,'sqls' 表示多数据库,null 表示不使用数据库
# 开发者相关配置
'Developer_mode' => true, // 开发者模式(true: 开启,false: 关闭,生产力环境请关闭该模式)
'Debug' => true, // 是否开启调试模式(true: 显示错误信息,false: 隐藏错误信息)
开发者相关配置
- Developer_mode:开发者模式,当开启时可以访问/developer,进入开发者控制台获取框架的资源;当网站上线时,请关闭该模式,避免泄漏敏感信息。
- Debug:是否开启调试模式,当开启时,框架会显示错误信息,当关闭时,框架会隐藏错误信息,网站上线时,建议关闭该模式。
# 路由相关配置项
'Routing_suffix' => 'easy', // 路由后缀,默认为空,可以设置为 'html'
'Routing_login' => true, // 是否登陆中间件 (true: 开启,false: 关闭),登陆中间件配置文件 data/login.php
路由相关配置项
- Routing_suffix:路由后缀,当设置为 'easy' 时,访问http://你的域名.com/user/index.easy时,会自动跳转到http://你的域名.com/user/index.easy,可以为空
- Routing_login:是否开启路由登陆中间件,当开启时,框架会更具配置文件data/login.php进行路由保护,当你需要登陆等功能时请设置登陆中间件。
# 视图相关配置项
'Show_cache' => false, // 是否缓存视图 (true: 开启,false: 关闭,会在cache目录生成缓存视图文件,可以有效提高视图的效率)
'View_channels' => false, // 是否开启视图互通模式(true: 允许,false: 不允许)
'View_security' => 'null', // 视图文件安全检查模式 (null: 不限制,forbid: 禁止模式[仅禁止使用指定的函数],allow:允许模式[仅允许使用指定的函数])
'View_safe_array' => ['include', 'if',],
视图相关配置项
- Show_cache:是否缓存视图,当开启时,框架会加载时会预先生成缓存视图文件,下次请求时会直接加载缓存视图文件,提高效率。当关闭时,框架会直接视图文件。
- View_channels:是否开启视图互通模式,当开启时框架加载视图文件为总目录下的视图文件,当关闭时,框架会直接加载应用目录下视图文件,这是一个标签配置项,详情见Include标签。
- View_security:视图文件安全检查模式,当设置为 'null' 时,表示不限制,当设置为 'forbid' 时,表示禁止模式,仅禁止使用指定的函数,当设置为 'allow' 时,表示允许模式,仅允许使用指定的函数。
- View_safe_array:视图文件函数列表,当视图文件安全检查模式设置为 'allow' 时,此列表中的函数将允许使用,当设置为 'forbid' 时,此列表中的函数将禁止使用。
应用编写规则
这篇文档将详细介绍EasyPHP的应用目录结构及应用编写规则。
# 应用目录结构
应用目录结构
├─app 应用实际目录 [框架目录]
│ ├─xxxx xxxx应用目录 [自定义目录]
│ │ └─xxxx.php xxxx应用文件 [自定义文件]
│ └─developer 开发者应用目录 [框架目录]
│ └─index.php 开发者应用文件 [框架文件]
应用目录结构演示
# 应用的工作原理
- 路由自动加载:应用分为顶级应用和子应用,顶级应用对应为app目录下的目录名称,例如app/admin对应应用名称,admin,子级应用对应顶级应用下的“应用.php”,子级应用默认为index,也就是当你访问http://你的域名.com/admin时,你实际访问的逻辑为http://你的域名.com/admin/index下的逻辑
- 顶级应用的注册:在app目录下创建应用目录框架会自动完成顶级应用的注册。
- 子级应用的加载逻辑:对于子级应用分为加载php文件和目录下的php文件两类,例如当前访问admin/user,那么加载的逻辑为:先加载app/admin/user.php如果该文件不存在再尝试加载app/admin/user/index.php
公共方法
这篇文档将详细介绍EasyPHP的公共方法的目录和编写。
# 公共方法目录结构
公共方法目录结构
├─function 公共方法目录 [框架目录]
│ ├─xxxx xxxx公共方法目录 [自定义目录]
│ │ └─xxxx.php 示例xxxx公共方法文件 [自定义文件]
│ └─public 全局公共方法目录 [框架文件]
│ └─myserver.php 服务器信息获取函数 [框架文件]
公共方法目录结构演示
# 公共方法
- 调用权限:公共方法分为全局公共方法和应用公共方法,全局公共方法服务于框架的任何应用,应用公共方法只服务于当前应用。
- public目录:这是全局公共方法目录,该目录下方法可以在所有应用中调用,例如:在app/admin/index.php中调用public/myserver.php中的方法。
- 应用的公共方法目录:当前注册了应用后,你可以在function目录创建同名的公共方法目录,实现应用公共方法的编写,例如当你注册了app/admin后,如果你希望编写app应用的公共方法,你需要在function/admin目录下创建admin公共方法目录,并编写admin公共方法。
# 公共函数的编写
// 你可以参考下面的编写格式。
function U($url) {
echo WEB_URL.APP_NAME.$url;
}
这样编写后你就可以在应用中直接调用U()函数了
PHP代码演示
视图
这篇文档将详细介绍EasyPHP的视图目录和编写。
# 视图目录结构
视图目录结构
├─theme 视图页面目录 [框架目录]
│ ├─xxxx xxxx应用视图目录 [自定义目录]
│ │ └─xxxx.php xxxx应用对应的视图 [自定义文件]
│ └─developer 开发者应用视图目录 [框架目录]
│ └─index.php 开发者用于显示的页面 [框架文件]
视图目录结构演示
# 视图简介
- 编写前的准备:编写应用视图之前,请先确保配置项:View_display已开启。
- 视图加载:应用视图文件存放于theme目录下的同名目录,例如admin应用的视图对应为theme/admin下的视图文件。
# 应用指定视图
// 当你在app/admin/index.php编写逻辑后,你需要为admin/index指定视图时你可以使用以下代码。
$mine->Template->show('index.php');
该方法只需要一个参数,即视图文件路径。
上述代码指定的视图文件为admin/index.php,当访问http://你的域名.com/admin/index时,你看到的为theme/admin/index.php。
PHP代码演示
# 向视图传参
// 当你在app/admin/index.php编写逻辑过程中你需要向视图传参,你可以使用以下代码。
$mine->template->give('userid', $_SESSION['user_id']);
该方法接收两个参数,第一个参数为键名,第二个参数为键值。
上述代码传递了一个名为userid的参数,值为$_SESSION['user_id']。
PHP代码演示
# 视图调用传参
// 当你在完成向视图传参后你可以在视图文件调用传递的参数。
echo $userid;
传递的参数以变量的形式进行调用。
PHP代码演示
视图标签
这篇文档将详细介绍的视图标签和编写,在编写您的自定义标签前建议先阅读现有标签的编写,本文件仅介绍框架标签和标签的编写,扩展标签请查看对应的标签文档。
# 视图标签
- 标签目录:视图标签逻辑存放于view_function目录下。
- 标签加载:程序会自动加载view_function目录下的所有标签文件。
# NO标签[框架标签]
// 当你在编写逻辑时遇到需要被保护的静态文件,你可以使用NO标签防止静态文件被解析
例如:有些Js代码可能会被当作模板标签解析替换掉,造成Js异常,这时候我们可以使用no标签包含下,Js就正常了。
{no}不解析的代码片段{/no}
PHP代码演示
# 常量输出标签[框架标签]
// 当你在前端调用系统常量时,你可以使用以下代码{常量},这样的写法可以直接输出常量,从而减少开发时间,常量需要为全大写。
{WEB_URL}
会被解析为 echo WEB_URL;
PHP代码演示
# 变量输出标签[框架标签]
// 当你在前端调用变量时,你可以使用以下代码{变量},这样的写法可以直接输出变量,从而减少开发时间。
变量输出标签支持各种类型的变量,例如$name,$data.id,$data['id']等。
{userid}
会被解析为echo $userid;
PHP代码演示
# 公共函数调用标签[框架标签]
// 当你在前端需调用公共函数是时,你可以使用以下代码{函数名},这样的写法可以直接调用公共函数,从而减少开发时间。
公共函数需首字母大小
{U('index')}
会被解析为调用公共函数U传递参数index
PHP代码演示
# 标签的编写
// 你可以参考这个演示的代码格式,编写标签。
return function ($params) {
// 提取参数
$condition = $params['condition'] ?? '';
$content = $params['content'] ?? '';
// 匹配 foreach 条件部分
if (!preg_match('/\$(\w+)\s+as\s+\$(\w+)(?:\s*=>\s*\$(\w+))?/', $condition, $matches)) {
throw new Exception("无效的 foreach 标签条件:
Notice: Undefined variable: condition in /www/wwwroot/epigenetic.myapi.work/cache/user/docs.php.php on line 984
");
}
$arrayName = $matches[1]; // 数组变量名
$valueVar = isset($matches[3]) ? $matches[3] : $matches[2]; // 值变量名
$keyVar = isset($matches[3]) ? $matches[2] : null; // 键变量名(可选)
// 验证变量名是否合法
if (!preg_match('/^\w+$/', $arrayName) || !preg_match('/^\w+$/', $valueVar) || ($keyVar && !preg_match('/^\w+$/', $keyVar))) {
throw new Exception("无效的变量名:
Notice: Undefined variable: condition in /www/wwwroot/epigenetic.myapi.work/cache/user/docs.php.php on line 993
");
}
// 构建 PHP foreach 代码
$phpCode = "< ?php if (is_array(\$
Notice: Undefined variable: arrayName in /www/wwwroot/epigenetic.myapi.work/cache/user/docs.php.php on line 997
) || \$
Notice: Undefined variable: arrayName in /www/wwwroot/epigenetic.myapi.work/cache/user/docs.php.php on line 997
instanceof Traversable): ?>";
if ($keyVar) {
// 如果有键变量,则生成带键的 foreach
$phpCode .= "< ?php foreach (\$
Notice: Undefined variable: arrayName in /www/wwwroot/epigenetic.myapi.work/cache/user/docs.php.php on line 1000
as \$
Notice: Undefined variable: keyVar in /www/wwwroot/epigenetic.myapi.work/cache/user/docs.php.php on line 1000
=> \$
Notice: Undefined variable: valueVar in /www/wwwroot/epigenetic.myapi.work/cache/user/docs.php.php on line 1000
): ?>";
} else {
// 如果没有键变量,则只生成值的 foreach
$phpCode .= "< ?php foreach (\$
Notice: Undefined variable: arrayName in /www/wwwroot/epigenetic.myapi.work/cache/user/docs.php.php on line 1003
as \$
Notice: Undefined variable: valueVar in /www/wwwroot/epigenetic.myapi.work/cache/user/docs.php.php on line 1003
): ?>";
}
$phpCode .= $content;
$phpCode .= "< ?php endforeach; endif; ?>";
return $phpCode;
};
PHP代码演示
公共类
# 视图目录结构
公共类目录结构
├─class 公共操作类目录 [框架目录]
│ ├─Template.php 视图显示类 [框架文件]
│ └─Sql.php 数据库操作类 [框架文件]
公共类目录结构演示
# 公共类说明
- 自动加载:程序会自动加载class目录下的所有类文件。
- 命名习惯:类的命名需于其文件名相同,并且以首字母大写。
# 公共类的调用
// 示例 PHP 代码
$mine ->类名->方法名();
PHP示例代码
# 公共类的编写
//你可以参考下面的这种写法
class Returns
{
/**
* 返回错误信息
*
* @param string $message 错误信息
* @return void 输出 JSON 格式字符串
*/
public function error($message)
{
echo json_encode([
'state' => 'error',
'msg' => $message
], JSON_UNESCAPED_UNICODE);
}
/**
* 返回成功信息
*
* @param string $message 成功信息
* @return void 输出 JSON 格式字符串
*/
public function success($message)
{
echo json_encode([
'state' => 'success',
'msg' => $message
], JSON_UNESCAPED_UNICODE);
}
}
PHP示例代码