## ** EASYLT 3 框架开发手册(核心版)**
[TOC]
#### **前言**
**EASYLT读音为[ˈiːziɔːlt],寓意为简单、轻松、优雅的开发、维护项目,在倡导无代码、低代码的大环境下,为敏捷构建项目、API开发而生,对于之前使用过其他框架的开发者可在30分钟内掌握框架。**
#### **框架部署**
------
##### 环境要求
- 保证**php**版本>=**7.0(建议使用7.3.4)**
- 保证**web服务器**采用**Apache**
- 保证**关系型数据库**采用**Mysql**
- **(可选项)**保证**缓存数据库**采用**Redis**
##### 下载部署
1、通过以下几种方式下载EASYLT:
- [https://www.easylt.cn](https://www.easylt.cn)官网直接下载,可在历史版本中下载老版本。
- Git下载指令:git clone https://github.com/myframe1002223338/easylt.git
- wget下载指令:wget https://easylt.cn/easylt.zip
- composer安装指令:composer create-project "easylt3/easylt3":"dev-master"
PS:composer安装显示以下错误:
[Symfony\Component\Process\Exception\RuntimeException]
The Process class relies on proc_open, which is not available on your PHP installation.
解决方法:打开php.ini,搜索disable_functions,找到disable_functions = xxx,xxx,xxx...删除其中的
proc_open保存并重启服务器即可。
2、将下载的EASYLT框架复制到web服务器运行目录下(如Linux系统宝塔面板路径:/www/wwwroot/easylt),并设置站点运行目录为框架根目录,**注意不是public目录**。
> - **运行目录错误将无法正常运行框架,easylt框架根目录名称可自行更改。**
> - **如果生产环境使用可视化环境部署,如宝塔面板,请将框架根目录的.htaccess中内容复制到站点伪静态中。**
>
#### **使用框架**
------
##### 配置文件
- 请在EASYLT根目录打开core/config目录,在config.php中对所有配置文件进行相应的配置更改,如mysql、redis数据库连接参数等;另外请更改常量ADDRESS为你的服务器公网IP或域名配置,请以http://或https://开头。
- 开发环境下建议在config.php配置更改常量ERROR_STATE为2,显示除了E_NOTICE的所有运行错误,便于开发调试;生产环境下请务必再次配置更改为0,屏蔽运行错误,保证线上安全性。
> - **不建议配置更改为-1,这样会显示所有错误类型包含E_NOTICE,可能会造成API出参回传数据异常。**
> - **开发中新的配置请直接写入到application目录下的config.php中。**
>
##### 框架运行
- 打开浏览器输入127.0.0.1,运行成功会出现以下页面:
![](http://easylt.cn/public/assets/frame_run.png)
- 运行模式
![](http://easylt.cn/public/assets/run_pattern_web.png)
- 开发一个DEMO **Hello World**
**第一步** 在view视图目录下创建一个demo.php文件并写入以下示例代码:
![](http://www.easylt.cn/public/assets/view_demo.png)
**第二步** 在model模型目录下创建一个demo.php文件并写入以下示例代码:
![](http://www.easylt.cn/public/assets/model_demo.png)
**第三步** 在logic逻辑目录下创建一个demo.logic.php文件并写入以下示例代码:
**PS:logic逻辑文件命名为相应model模型文件名拼接 .logic,以下逻辑文档有说明。**
![](http://www.easylt.cn/public/assets/logic_demo.png)
**第四步** 打开浏览器输入http://127.0.0.1/?href=demo,成功渲染并输出hello world!
##### 模型(model)
传统MVC架构的M(model)层,用于对数据进行映射、处理。
**1、model模型目录下的文件命名规范:文件名不支持大写字母。**
2、DB操作
- model模型下用于实现业务实体类模型,实体类中对关系型数据库mysql操作可采用ORM或mysqli面向过程写法;
- 非关系型数据库redis采用原生写法。
**3、API出参回传直接调用response函数,如下:**
> **response(200,'success',$data);第一个参数为code【必须为int数据类型】、第二个参数为message【必须为string数据类型】、第三个参数为返回的数据。**
> - **API出参回传数据统一自动返回json字符串格式,如response(200,'success','hello world!');数据返回后显示为 {"code":200,"msg":"response success!","data":"hello world!"},将该json字符串解析为数组、JavaScript对象进行取值。 **
> - **默认在logic逻辑文件中API出参回传数据,如果model模型文件没有对应的logic逻辑文件,请在model模型文件中返回API数据出参回传。**
##### 视图(view)
传统MVC架构的V(view)层,用于页面渲染输出。
**1、view视图目录下的文件命名规范:文件名不支持大写字母,如果文件中包含html、css、js代码,仍然后缀名为.php。**
2、view视图下的start.php为起始文件,请更换start.php的代码为项目首页、登录或注册页面。
**PS:请勿更改start.php文件名或删除该文件**
**3、关于view视图资源文件引入:Apache服务器请支持.htaccess,view视图文件中引入的资源如js、css、images、fonts等目录/文件请直接放置到框架根目录下,资源文件中的路径无需进行修改。**
> **如果js目录中包含.php文件,在view文件中需要引入该js下.php文件,则引入方式为如:include('../assets/js/test.php'),需要返回一个层级,否则会引入失败。**
4、view视图目录下的文件跳转指定页面请调用常量VIEW_PUBLIC并拼接跳转的文件名,不包含扩展名,如跳转到view视图目录下的login.php:
```
echo '';
```
或手动输入如:
```
http://127.0.0.1/?href=login
```
**PS:**
- **VIEW_PUBLIC常量值为服务器域名或公网IP+/?href=,如http://127.0.0.1/?href=**
5、如需要get请求在跳转的文件名后拼接key=value,多参数用&连接,代码中用$_GET['key']取值,如:
```
echo '';
```
##### 控制(controller)
传统MVC架构的C(controller)层,view视图与model模型之间的调配。
**Index控制器为通用控制器,默认无需创建新的控制器及任何改动,根据以下路由文档说明使用即可。**
> **如需在控制器中增加额外的业务处理,如API - Sign验签业务,直接在Index控制器类中的构造方法中实现即可。**
##### 路由(route)
路由示例:http://127.0.0.1/m/v/p/index/model/param/key1=value&key2=value
- m/为application应用目录路径
- v/p/为presenter/controller/控制器目录路径
- index/为Index控制器文件名,不包含.php扩展名;
- model/为model模型目录下指定文件名,不包含.php扩展名;
- param/为路由参数,用于判断model文件下多接口业务分发对接,用$query_param[‘key’],取值可选项;
- key1=value为get请求入参,多参数用&连接,用$query_get['key']取值,可选项;
##### 逻辑(logic)
MVC架构升级为MVP后,C(controller)层衍变为P(presenter)层,包含controller控制层与logic逻辑层;逻辑层用于解耦model模型、controller控制器、view视图,将业务逻辑在logic逻辑文件中处理。
**1、logic逻辑目录下的文件命名规范:文件名不支持大写字母,logic文件命名为model相应文件名拼接.logic,**如model文件名为login.php,则logic相应文件名必须为login.logic.php。
**2、在logic逻辑文件中写业务可以直接调用相应model模型文件中的变量、函数、类、类方法、类属性。**
**3、API出参回传直接调用response函数,如下:**
> **response(200,'success',$data);第一个参数为code【必须为int数据类型】、第二个参数为message【必须为string数据类型】、第三个参数为返回的数据。**
> - **API出参回传数据统一自动返回json字符串格式,如response(200,'success','hello world!');数据返回后显示为 {"code":200,"msg":"response success!","data":"hello world!"},将该json字符串解析为数组、JavaScript对象进行取值。 **
> - **默认在logic逻辑文件中API出参回传数据,如果model模型文件没有对应的logic逻辑文件,请在model模型文件中返回API数据出参回传。**
##### 助手函数
【日志】
用于抛异常时对异常、错误信息的记录,直接在业务中调用onerror($message,$path);方法即可。
- $message为必填项,为异常、错误信息。
- $path为选填项,为log文件路径。当不传入该参数时,异常、错误信息自动写入core/log/errors.log中。
- 当传入$path时,值为:ERRORS_PATH.'log文件名',此时异常、错误信息会写入到core/log/指定log文件中。
【打印】
可以通过dump($var,$label)打印数据,更好的格式显示。
- $var为必填项,支持各种数据类型。
- $label为选填项,为打印时的前缀标签。
> **开发中封装的类/方法库请直接写入到application目录下的common.php中。**
##### 框架变量
- **$request**
【应用层:contoller、model、logic】请求的入参数据,数据类型为array,根据键值对取值。如API入参的
json字符串数据为{"username":"liteng"},则在model文件中$request['username']的值为liteng。
- **$response**
【应用层:model、logic】在model或logic文件中的API出参回传数据变量,且格式如下:
$response = [$code,$msg,$data];第一个元素为code【数据类型为int】、第二个元素为message【数据类
型为string】、第三个元素为返回的数据【数据类型不限】。
> response($code,$msg,$data);可以替代$response = [$code,$msg,$data];
- **$query_param**
【应用层:controller、model、logic】用于判断同一文件下多接口业务分发对接,如以下API请求URL:
http://127.0.0.1/m/v/p/index/login/one ,$query_param的值为one。
- **$query_get**
【应用层:controller、model、logic】获取API请求URL中的GET参数,数据类型为array,根据键值对取
值。如以下URL:
http://127.0.0.1/m/v/p/index/login/frame=easylt&username=liteng
$query_get['frame']的值为easylt,$query_get['username']的值为liteng
- **$mysql_conn**
【应用层:model】mysql连接变量,采用mysqli面向过程写法,在model目录文件中使用。
- **$mysql_orm**
【应用层:model】mysql-orm操作变量,在model目录文件中使用,具体操作请阅读**ORM**部分文档。
- **$redis**
【应用层:model】redis连接变量,在model目录文件中使用。
- **$curl_post**
【应用层:view、controller、model、logic】curl数据传输post请求模式,应用示例如下:
$result = $curl_post->post($url,$data,$headers,$status),第一个参数为目标文件的url、第二个参数为发
送的数据、第三个参数为头信息请求参数(非必填)、第四个参数为$data数据转换状态值(非必填),
$result为请求返回值。
//$headers的数据类型必须为array,且为一维数组,元素值用冒号分隔键值对,如:['Authorization:init']
//$status参数默认可填值为'json'、'form',当头信息请求包含以下参数时:
['Contenttype:application/json','Accept:application/json'],请填入'json',此时body请求参数自动转换为
json格式;
当头信息请求包含以下参数时:
['Content-Type:application/x-www-form-urlencoded'],请填入'form',此时body请求参数自动转换为uri
拼接参数,如name=easylt&type=php;
- **$curl_get**
【应用层:view、controller、model、logic】curl数据传输get请求模式,应用示例如下:
$result = $curl_get->get($url,$headers),第一个参数为目标文件的url、第二个参数为头信息请求参数(非
必填),$result为请求返回值。
//$headers的数据类型必须为array,且为一维数组,元素值用冒号分隔键值对,如:['Authorization:init']
- **$headers_message**
【应用层:controller、model、logic】获取头信息请求参数,数据类型为array,如获取头信息请求参数中的
Authorization值:$headers_message['Authorization']
- **$excel**
【应用层:controller、model、logic】获取头信息请求参数,数据类型为array,如获取头信息请求参数中的
【应用层:controller、model、logic】获取PHPExcel实例化对象变量,框架引入PHPExcel类库,用于处理
Excel数据业务。
##### 框架常量
常量值可在core/config目录下的config.php中进行配置
- **ADDRESS:**服务器公网IP或域名,如https://www.easylt.cn
- **API_URL:**Index通用控制器下的API接口地址,Apache/Nginx服务器请支持.htaccess/nginx.htaccess。在VIEW视图中请求API时,在API_URL常量后拼接接口名称(model模型文件名),如API_URL.'login'。
- **API_URL_OTHER:**同上,当Apache/Nginx服务器不支持.htaccess/nginx.htaccess时,用此常量。
- **VIEW_PUBLIC:**入口加载文件地址,Apache/Nginx服务器请支持.htaccess/nginx.htaccess。加载VIEW视图时,在VIEW_PUBLIC常量后拼接view视图文件名,如VIEW_PUBLIC.'login'。
- **VIEW_PUBLIC_OTHER:**同上,当Apache/Nginx服务器不支持.htaccess/nginx.htaccess时,用此常量。
- **ROOT_PATH:**地址指向框架根目录
- **APP_PATH:**地址指向application目录
- **EXTEND_PATH:**地址指向extend目录
- **CORE_PATH:**地址指向core目录
- **ASSETS_PATH:**view视图静态资源路径,地址指向/public/assets/
- **LIB_PATH:**lib类库目录路径,地址指向/core/lib/
- **ERRORS_PATH:**log日志目录路径,地址指向/core/log/
- **D:**路径分隔符
##### **ORM(MySQL)**
新手版操作仅使用ORM原生写法即可,便于快速上手。
###### ORM原生写法
**$mysql_orm->db('sql');** //【必填项】直接在类方法实参中传入原生sql
- insert操作,返回成功写入数据的行数量。
- delete操作,必须在sql中设置where条件。返回成功删除数据的行数量。
- update操作,必须在sql中设置where条件。返回成功更新数据的行数量。
- select操作,返回类型为array,返回数据查询结果。
###### 事务
事务支持ORM的原生、非原生写法,开启事务后必须commit提交或rollback回滚才能结束事务。
- 开启事务:$mysql_orm->trans();
- 事务回滚:$mysql_orm->rollback();
- 事务提交:$mysql_orm->commit();
示例:
$mysql_orm->trans();
$result = $mysql_orm->db("insert into account(username) values('init')");
$result2 = $mysql_orm->db("insert into account(username) values('init2')");
if(!$result || !$result2){
$mysql_orm->rollback();
}
$mysql_orm->commit();
//如上示例,当$result、$result2有一个未执行成功则数据回滚不进行提交。
###### 悲观锁
ORM原生写法的悲观锁请用原生sql自行实现,如select * from account where id=1 for update;
------
**感谢使用EASYLT 让开发更简单**
EASYLT官网:[https://www.easylt.cn](https://www.easylt.cn)