橘子PHP框架 1.以AOP、IOC为主的php后端框架,内涵动态代理、责任链、单例等设计模式;
2.其中ORM数据库对象映射OrangeBatis也是一大亮点。
3.橘子PHP框架借鉴了个大网站框架,并使用了各种设计模式,以学习为目的PHP web框架。
OrangeBatis参考了Java的MyBatis,使用了iXXXDao访问接口、sql的配置xml文件,内部使用动态代理模式创建数据库访问类,对数据表字段和对象进行自动映射,让使用者更注重业务本身。

目录及主要类介绍:
-db //测试数据库
-nginx //nginx vhost配置文件 -demo //测试环境
---controller //控制器
---DB //数据库
-----Bean //数据表字段映射的对象
-----DAO //数据库访问接口
-----XmlModel //xml配置文件
---ProxyTemp //动态代理生成类
---Http //请求封装类
---Plugin //各种管理工具
-src //设计模式源代码
---class//类目录
-----aop//面向切片编程
-------BaseFilter.php//责任链节点接口
-------FilterChain.php//责任链
-------FilterHead.php//责任链头
-------FilterTail.php//责任链尾部
-------iFilter.php//责任链节点接口
-------InvocationHandler.php//动态代理接口
-------JsonFilter.php//json数据打包解包的责任链节点
-------Proxy.php//动态代理生成器
-----ioc//依赖注入
-------Container.php//注入容器
-------DocParser.php//document解析器
-----orm//对象关系映射
-------BaseBatisProxy.php//代理基类
-------BaseBean.php//数据库表的映射对象
-------BaseNode.php//xml节点的接口
-------ChooseNode.php//xml节点中的选择分支 -------iBaseDao.php//数据访问层基类接口
-------OrangeBatis.php//对象关系映射器
-log //日志目录

一.动态代理

1.动态代理是AOP的一种实现;
2.被代理类需要基层一个自定义接口;
3.实例在WebServer.php中,实现了在对TestControl代码不进行侵入的情况下,执行时间的计算和日志记录。

二.责任链模式:
1.在WebServer.php中使用了责任链模式;
2.类FilterChain为责任链,其中每个节点都需要继承BaseFilter;
3.责任链模式可以细化数据处理的粒度,也是AOP切面编程的一种运用。

三.IOC
1.使用ioc创建的类是全局单例模式(参数相同);
2.创建单例时,暂时无法解析构造函数的参数,请使用无参构造函数;
3.把需要ioc注入的变量设置成类的成员变量;
4.用@inject 类名设置这个成员变量的doc;
5.使用Container::instance()->get(类名);创建类实例;
6.支持@param参数,在注入时,添加自定义参数,[格式:@param 类型 值];
7.@param参数,按照从上到下的顺序依次注入到类构造函数中,请注意顺序;
8.当@param参数值不同(包括类型和顺序),注入的类实例也会不一样。
这样该实例中声明了@inject的成员变量都想被自动创建

四.ORM
对象映射需要几个步骤:
1.创建一个与表字段对应的Bean,名字对应,可以按照不同的字段数据类型设置映射成员变量的数据类型;
2.Bean中的数据表映射对象,需要继承BaseBean类,且子类的成员变量需要使用protected修饰,这样可以解决json序列化无法获取private修饰成员函数;
3.创建DAO操作接口,接口类命名规则:1)小写i起始;2)驼峰式命名方式的表名;3)Dao结尾。这里需要注意,如果传入的参数为对象,需要主动声明;
4.创建xml,使用表名命名xml的文件名,其中按照示例给出的格式:
节点tag(select、insert、update、delete);id(接口名);resultType(返回类型);sql语句.
5.使用ioc注入方式创建,在标注成员变量的Doc时,使用@inject 类名 即可动态注入;

五.请求与功能的映射关系 对CONTROLLER_PATH定义的Controller目录进行搜索,反射获取类doc和函数的Doc,其中需要关注一下几个关键字:
1.class Doc中的@Controller,每个类的Doc中必须定义@Controller,不然该类会被忽略;
2.响应函数必须是public;
3.响应函数的Doc中,必须声明GetMapping/PostMapping/RequestMapping;
4.其中,GetMapping只响应get请求,PostMapping只响应post请求,RequestMapping则都会响应;
5.以上GetMapping/PostMapping/RequestMapping也可以声明在类Doc中,最终将类的Mapping拼接上函数的Mapping,组成最终地址提供。
6.以上可以使用[域名/test2/b]进行测试

以下为实例demo/controller/TastController的执行结果:
带参数的依赖注入的类实例TestManager->show() string:5; integer:测试注入的字符串参数; const:this string is defined text

获取5条记录 sql:select * from my_table limit :page, :pagecount 10001 Georgi Facello M 10002 Bezalel Simmel F 10003 Parto Bamford M 10004 Chirstian Koblick M 10005 Kyoichi Maliniak M

使用json打包实例 [{"id":"10001","first_name":"Georgi","last_name":"Facello","gender":"M"},{"id":"10002","first_name":"Bezalel","last_name":"Simmel","gender":"F"},{"id":"10003","first_name":"Parto","last_name":"Bamford","gender":"M"},{"id":"10004","first_name":"Chirstian","last_name":"Koblick","gender":"M"},{"id":"10005","first_name":"Kyoichi","last_name":"Maliniak","gender":"M"}]

使用in查询 sql:select * from my_table where id in (10001,10002,10003) order by id 10001 Georgi Facello M 10002 Bezalel Simmel F 10003 Parto Bamford M

获取firstname='Tzvetan' sql:select * from my_table where first_name = :firstName 10007 Tzvetan Zielinski F

获取记录总数: 10条记录 sql:select count(*) from my_table LIMIT 1

获取性别为F的记录总数: 5条记录 sql:select count(*) from my_table where gender = :gender LIMIT 1

修改10001号记录的lastname='Mithril' 1修改完成 sql:update my_table set last_name=:lastName where id = :id

获取10001号记录 sql:select * from my_table where id = :id 10001 Georgi Mithril M

插入1条记录 sql:insert into my_table (id, first_name, last_name, gender)values(:id, :first_name, :last_name, :gender)

获取10011号记录 sql:select * from my_table where id = :id 10011 Smith William M

删除10011号记录 删除1条记录 sql:delete from my_table where id = :id

获取10011号记录 sql:select * from my_table where id = :id /var/www/OrangeFrame/demo/controller/TastController.php:97: object(my_table)[22] protected 'id' => null protected 'first_name' => null protected 'last_name' => null protected 'gender' => null

版权声明:

1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。
2、网站不提供资料下载,如需下载请到原作者页面进行下载。
3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考学习用!
4、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。