简介

你正在阅读的是 Epigenetic 后生 v1.0版本 的文档!感谢您选择使用我们的框架,让我们一起共同进步吧...


# 什么是Epigenetic 后生?

  1. 我们的框架中文名为"后生",英文为"Epigenetic",寓意为框架界的晚辈,我们还需学习前辈们的优点逐渐成长。

# 我们的优点?

  1. 这是一个全开源框架,我们允许用户在符合协议的基础上自行修改框架代码。
  2. 简单易上手是我们设计框架的主要思路,我们希望用户能够快速上手框架。
  3. 核心框架设计为轻量级,我们希望按需下载框架,从而提高用户体验。

快速上手指南

本指南将帮助您快速了解如何使用 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               开发者用于显示的页面  [框架文件]
        后生目录结构演示

# 说明

  1. index.php:框架的入口文件,负责加载核心逻辑。
  2. function/:存放公共方法,分为应用公共方法和全局方法。
  3. class/:存放公共操作类,如数据库操作类。
  4. controller/:存放公共控制器,如路由控制器和方法管理控制器。
  5. data/:存放全局配置文件和其他杂项。
  6. app/:存放实际应用的代码。
  7. 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
        基础配置项
  1. Default_app:默认顶级应用名称,当用户访问网站未指定应用时则默认使用此名称,例如当配置为user,则访问http://你的域名.com/时,则访问的是user应用下的index.php文件。
  2. View_display:是否开启视图模式,当开启时,框架会加载视图文件;当关闭时,框架不会产生前端页面,常用于纯后端开发。
  3. Global_404:是否开启全局 404 视图,当开启时,当出错时框架会自动加载404页面;当关闭时,框架会直接返回错误信息。
  4. Sql:指定数据库模式,'sql' 表示单数据库,'sqls' 表示多数据库,null 表示不使用数据库

# 开发者相关配置


'Developer_mode' => true, // 开发者模式(true: 开启,false: 关闭,生产力环境请关闭该模式)
'Debug' => true, // 是否开启调试模式(true: 显示错误信息,false: 隐藏错误信息)
        开发者相关配置
  1. Developer_mode:开发者模式,当开启时可以访问/developer,进入开发者控制台获取框架的资源;当网站上线时,请关闭该模式,避免泄漏敏感信息。
  2. Debug:是否开启调试模式,当开启时,框架会显示错误信息,当关闭时,框架会隐藏错误信息,网站上线时,建议关闭该模式。

# 路由相关配置项


'Routing_suffix' => 'easy', // 路由后缀,默认为空,可以设置为 'html'
'Routing_login' => true, // 是否登陆中间件 (true: 开启,false: 关闭),登陆中间件配置文件 data/login.php
        路由相关配置项
  1. Routing_suffix:路由后缀,当设置为 'easy' 时,访问http://你的域名.com/user/index.easy时,会自动跳转到http://你的域名.com/user/index.easy,可以为空
  2. 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',],
        视图相关配置项 
  1. Show_cache:是否缓存视图,当开启时,框架会加载时会预先生成缓存视图文件,下次请求时会直接加载缓存视图文件,提高效率。当关闭时,框架会直接视图文件。
  2. View_channels:是否开启视图互通模式,当开启时框架加载视图文件为总目录下的视图文件,当关闭时,框架会直接加载应用目录下视图文件,这是一个标签配置项,详情见Include标签。
  3. View_security:视图文件安全检查模式,当设置为 'null' 时,表示不限制,当设置为 'forbid' 时,表示禁止模式,仅禁止使用指定的函数,当设置为 'allow' 时,表示允许模式,仅允许使用指定的函数。
  4. View_safe_array:视图文件函数列表,当视图文件安全检查模式设置为 'allow' 时,此列表中的函数将允许使用,当设置为 'forbid' 时,此列表中的函数将禁止使用。

应用编写规则

这篇文档将详细介绍EasyPHP的应用目录结构及应用编写规则。


# 应用目录结构


应用目录结构
├─app                           应用实际目录  [框架目录]
│  ├─xxxx                       xxxx应用目录  [自定义目录]
│  │  └─xxxx.php                xxxx应用文件  [自定义文件]
│  └─developer                  开发者应用目录  [框架目录]
│     └─index.php               开发者应用文件  [框架文件]
        应用目录结构演示

# 应用的工作原理

  1. 路由自动加载:应用分为顶级应用和子应用,顶级应用对应为app目录下的目录名称,例如app/admin对应应用名称,admin,子级应用对应顶级应用下的“应用.php”,子级应用默认为index,也就是当你访问http://你的域名.com/admin时,你实际访问的逻辑为http://你的域名.com/admin/index下的逻辑
  2. 顶级应用的注册:在app目录下创建应用目录框架会自动完成顶级应用的注册。
  3. 子级应用的加载逻辑:对于子级应用分为加载php文件和目录下的php文件两类,例如当前访问admin/user,那么加载的逻辑为:先加载app/admin/user.php如果该文件不存在再尝试加载app/admin/user/index.php

公共方法

这篇文档将详细介绍EasyPHP的公共方法的目录和编写。


# 公共方法目录结构


公共方法目录结构
├─function                      公共方法目录  [框架目录]
│  ├─xxxx                       xxxx公共方法目录  [自定义目录]
│  │  └─xxxx.php                示例xxxx公共方法文件  [自定义文件]
│  └─public                     全局公共方法目录  [框架文件]
│     └─myserver.php            服务器信息获取函数  [框架文件]
        公共方法目录结构演示

# 公共方法

  1. 调用权限:公共方法分为全局公共方法和应用公共方法,全局公共方法服务于框架的任何应用,应用公共方法只服务于当前应用。
  2. public目录:这是全局公共方法目录,该目录下方法可以在所有应用中调用,例如:在app/admin/index.php中调用public/myserver.php中的方法。
  3. 应用的公共方法目录:当前注册了应用后,你可以在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               开发者用于显示的页面  [框架文件]
        视图目录结构演示

# 视图简介

  1. 编写前的准备:编写应用视图之前,请先确保配置项:View_display已开启。
  2. 视图加载:应用视图文件存放于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代码演示

视图标签

这篇文档将详细介绍的视图标签和编写,在编写您的自定义标签前建议先阅读现有标签的编写,本文件仅介绍框架标签和标签的编写,扩展标签请查看对应的标签文档。


# 视图标签

  1. 标签目录:视图标签逻辑存放于view_function目录下。
  2. 标签加载:程序会自动加载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                    数据库操作类  [框架文件]
        公共类目录结构演示

# 公共类说明

  1. 自动加载:程序会自动加载class目录下的所有类文件。
  2. 命名习惯:类的命名需于其文件名相同,并且以首字母大写。

# 公共类的调用


// 示例 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示例代码