## **logo 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)