手机版

ThinkPHP框架设计和扩展详解

时间:2021-09-09 来源:互联网 编辑:宝哥软件园 浏览:

Thinkphp框架是国内知名且应用广泛的php框架。让我们从一些简单的开发示例中,深入了解一下这个框架及其易于扩展的设计所带来的开发便利。同时,我们也从源代码分析的角度来看待框架的一些不足,试图做出全面客观的评价。假设大家都已经使用过ThinkPHP框架了。基本用法请参考官方文件。

I .框架分层和url路由

框架的安装非常简单。下载后可以放到web服务器的目录下。但是,建议您将其放在单独的目录中,而不是默认的条目文件位置,以保护代码和数据。例如,我的门户文件和web服务器配置目录位于web目录中(外框中的index.php未删除但未使用):

和大多数MVC框架一样,我们只需要根据框架的目录结构来扩展我们的Controller和View,并且开发了一些页面。ThinkPHP提供了Module、Controller和Action三层结构来组织自己的URL(3.1版叫分组、Action和方法,3.2版比较国际化),目录结构如下:

在这里,我们强烈建议您:1。业务应该单独分层,而不是放在控制器和模型中。比如这里,我通过扩展函数库application/common/common/function . PHP,强制业务层名称为Service:

函数service($name){ return D($name,' Service ');}优点是复用性好。如果以后想开发wap页面,写不同的Controller,可以重用服务。如果将来数据存储发生变化,例如将数据库从mysql迁移到mongodb,则可以修改Model,但服务仍然不需要任何修改。

2.将基础模块和业务模块分开,不要相互参照。基本模块(如用户基本信息)只提供数据接口,不提供控制器和视图。三层目录可以处理一般的web应用,我们可以定义不同的入口文件,加载不同的应用来解决更复杂的web应用。更复杂的应用?门户和超大规模网站,它不是一个可以解决所有问题的php框架,它需要自己的中间件和定制框架。

ThinkPHP支持四种url访问模式,分别是:

1.普通模式,传统url模式,所有参数都是分开的,例如,http://localhost/tp/index.php?M=Ucaic=Usera=indexpara=xxx路由参数:m参数表示模块,c表示控制器,a表示访问方法2,兼容模式http://localhost/tp/index.php?S=/Ucai/User/index/para/xxx路由参数由s参数组装而成,但数据参数不需要放入s参数中。3.pathinfo模式http://localhost/TP/index . PHP/ucai/user/index/para/XXX这种模式把入口文件和真实脚本放在一起,意思很明确。还方便了SEO4和重写模式http://localhost/TP/ucai/user/index/para/XXX,通过web服务器的重写配置隐藏了入口文件,更加友好,其中pathinfo和重写模式需要web服务器的支持。ThinkPHP有一个配置需要设置为哪种模式,在u方法中生成url链接时实际使用的是哪种模式,只要web服务器支持。也建议ThinkPHP不需要配置,但是要记住用户的访问方式。只要使用第一种访问模式,未来生成的URL都会以这种方式生成,因为用户已经访问过了,所以不存在支持的问题。

如果正常的网址不能满足我们的要求,我们可以通过配置路由来进一步优化网址。例如,我们想更简单地配置url。http://localhost/TP/ucai/log in/XXX,我们只需要在模块配置文件中添加以下路由配置,如果使用正则表达式,可以更加简化

URL _ route _ rules '=array(' log in/: para '=' ucai/user/index ',' login'=' ucai/user/index ',)。在这里我们可以看到ThinkPHP框架支持的层次结构和URL配置非常丰富,可以满足各种需求。当然,我们建议您不要滥用路由配置。少量的配置可以带来更好的seo效果,但是大量的配置会给项目的维护和修改带来困难。

第二,ThinkPHP扩展

ThinkPHP本身包含丰富的组件和驱动程序。让我们以数据库驱动扩展和行为扩展为例,来了解一下ThinkPHP的扩展设计。

第三,数据库驱动的扩展

虽然ThinkPHP提供了很多数据库驱动,但是并不能满足所有的需求。比如我们的数据很可能不是通过直接访问数据库来实现的,而是通过一些中间件(比如C程序)来转发,从而获得更好的性能。此时,我们需要扩展数据库驱动程序来支持它。扩展非常简单。在数据库/驱动程序目录下创建您自己的驱动程序,例如Custom.php,然后扩展请求和执行方法。然后在配置文件中配置DB_TYPE='custom ',就可以使用了。这里,请求意味着查询,执行意味着更改数据,所有其他操作将在模型中解析,打包为sql语句,并调用这两个方法来执行。例如,我实现的最简单的查询方法,通过shell命令调用sqlite来执行sql语句:

公共函数查询($ str){ $ cmd=sprint f(' SQLite 3% s ' % s ',$ this-config[' params '][' dbfile '],$ str);exec($cmd,$ arr);}当然,这只是一个例子。ThinkPHP本身支持sqlite3,可以通过pdo连接。实际的应用环境可能是通过连接第4层协议来访问中间层端口以获取数据。

第四,行为行为扩张

行为设计是ThinkPHP框架的核心,它通过行为配置和扩展,为系统的可扩展性和定制性提供了最大的支持。如果我们想添加登录验证功能,我们会像往常一样设计自己的父类Controller,然后其他所有控制器都会继承它。但是,通过行为,它将变得更加简单和灵活。我们只需要在tags.php添加一个行为(如果没有,在配置目录中创建新的行为):

返回数组(' action_begin'=数组(' Ucai\Behavior\AuthBehavior '),' view_begin'=数组(' Ucai\Behavior\OutputBehavior '),);当程序执行到action_begin进程时会调用这个Behavior,我们可以根据状态跳转或者终止执行。

命名空间Ucai \行为;Class AuthBehavior {//行为扩展的执行项必须是run public function run($ return){//不需要验证的动作设置为true if(!$ return[' AUTH _ PUBLIC ']){ if(service(' User ')-check log in()){ $ return=true;} else { header(' Content-type : text/html;charset=utf-8 ');重定向(u ('user/index ',array(' URL '=$ _ server[' http _ referer '])),5,'需要登录,5秒后跳转。');}}}}对于不需要登录的页面,我们可以在Controller中添加配置,以及所有不需要登录验证的页面。

PUBLIC $ config=array(' AUTH _ PUBLIC '=true);在这里,我们对继承和行为进行比较,实现登录验证,可能会觉得差别不大。然而,在一个复杂的项目中,会有很多功能。如果将每个函数放入父类中,它将非常大,可能不需要一些子类。此时,使用行为定制流程将会很容易。在上面的配置中,我们还发现配置OutputBehavior可以更好地解释这个问题。你有没有猜到这个行为是用来输出视图中的一些常见变量,比如jscss的域名和路径。在没有Behavior之前,是需要一个公共方法,然后在每一页上调用一次,还是重写View的类代码?有了行为,就方便多了。

命名空间Ucai \行为;class output behavior { public function run($ return){ $ View=\ Think \ Think 3360: instance(' Think \ View ');$view-assign('STATIC_URL ',' http://p 3 . ucai.cn/STATIC ');}}扩展总结:通过Behavior扩展和数据库驱动的扩展,我们可以看到ThinkPHP提供了灵活的扩展和增强机制,可以满足很多需求。其他存储、缓存、日志、模板引擎等。如果需要,可以很容易地扩展。

动词(verb的缩写)源代码分析和缺陷

首先我们来分析一下框架执行的一般流程:index.php(入口、调试模式、应用程序路径)-ThinkPHP.php(定义路径和访问模式)- Think\Think(类加载器、异常处理、读取常用配置)-think \ App(请求url调度分析并执行调度分析结果)- exec执行Controller的自定义Action方法- Think\Dispatcher(根据url模式解析M、C、A和参数,加载模块配置)- Think\Controller(调用视图、包装和重定向)。其实框架的内部流程比较简单,有两个非常重要的类:Think\Hook:监控App、Action、View的各个阶段,执行BehaviorThink\Behavior:可配置(配置文件),添加或删除(代码)

在分析源代码的过程中,我们也看到了一些缺点:

1.太多的宏定义很难维护和修改。建议:单个文件中只定义了几个宏,其余的用类常量打包。2.太多面向过程的代码使得包装不清晰。建议:用面向对象的思想打包,比如url解析和打包,现在在Dispatcher中生成APP宏,然后在U方法中读取宏,生成最终的url。其实可以定义一个类来包装UrlHelper,比如这个类的两个方法parse和generate分别负责解析和生成url,这样代码结构会清晰很多。3.有些函数和类代码封装过多,不便于重用和改进。建议:用组合封装独立的函数内容,比如Model的验证函数,可以完全独立分类,也可以用于调用非Model对象。但是目前的验证接口是Model的保护方法,只能通过Model的create函数调用,只能通过外部的create方法进行验证。4.代码规范和风格问题。希望代码风格能够更加规范和标准。比如DB类是模板方法的父类,Model需要的所有方法都要用抽象方法或者抛出异常来定义。事实上,有些方法子类是不必要的,而Db类没有实现。

不及物动词摘要

Thinkphp作为国内流行的php框架,确实给我们的开发带来了便利。框架开发人员对web过程有透彻的理解,并且精通php函数的应用。该框架定义了灵活的配置和扩展来满足各种需求,并提供了丰富的组件和模块来加速开发。最后,ThinkPHP的文档和社区支持非常完善,这是框架流行不可或缺的一部分。我们也希望Thinkphp能够完善自己的结构,成为未来最好的php框架。

版权声明:ThinkPHP框架设计和扩展详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。