`
cyber4cn
  • 浏览: 38891 次
社区版块
存档分类
最新评论

ThinkPHP框架设计与扩展总结

阅读更多

原文详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=12

 可以在线运行查看效果哦!    

 

    导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一些简单的开发示例中来深入了解一下这个框架给我们带来的开发便捷性,以及游刃有余的扩展设计。同时也从源码分析的角度看看框架的一些不足,尽量做全面客观的评价。这里假设大家已经使用过ThinkPHP框架,基本使用方法请参考官方文档。

 

一、框架分层及url路由

    框架的安装非常简单,下载后放入web服务器的目录即可,但是建议大家不要用默认的入口文件位置,而是放入单独的目录,便于保护代码和数据。例如我的入口文件和web服务器配置目录在web目录(外层框架里的index.php没有删除但是没有使用):

 

同大多数MVC框架一样,我们只需要按框架的目录结构,扩展自己的ControllerView,一些页面就开发完成了。ThinkPHP提供ModuleControllerAction三层结构来组织自己的url3.1版本叫分组、Actionmethod3.2更加国际范),目录结构如下:

这里强烈建议大家:

1、业务单独分层,不用放在ControllerModel里,例如我这里通过扩展函数库

Application/Common/Common/function.php强制定义业务层名称为Service:
function service($name)
{
    return D($name, 'Service');
}

 

 

好处是复用性好,假如将来要开发wap页面,写了不同的Controller,就可以复用service,假如以后的数据存储变了,比如把数据库从mysql迁移到mongodb之类,那修改Model就可以,service还是不需要任何修改。

2、基础模块和业务模块分开,不要相互引用。基础模块(例如用户基本信息)只提供数据接口没有ControllerView

三层目录已经可以应对一般的web应用,更加复杂的web应用我们可以定义不同的入口文件加载不同的Application来解决。更更复杂的应用?门户和超大规模网站么,那就不是一个php框架能解决所有问题的了,需要自己的中间件和定制框架。

 

ThinkPHP的支持4url访问模式,分别是:

普通模式,传统url模式,所有参数分开,例如

http://localhost/tp/index.php?m=Ucai&c=User&a=index&para=xxx

路由参数:m参数表示模块,c表示控制器,a表示访问方法

兼容模式

http://localhost/tp/index.php?s=/Ucai/User/index/para/xxx

路由参数通过s参数组装,当然数据参数也可以不必放在s参数里

pathinfo模式

http://localhost/tp/index.php/Ucai/User/index/para/xxx

这种模式把入口文件和真实脚本放在一起,含义明确,也便于SEO

rewrite模式

http://localhost/tp/Ucai/User/index/para/xxx

这种模式通过web服务器的rewrite配置隐藏入口文件,显得更加友好

其中pathinforewrite模式需要web服务器支持。ThinkPHP有个配置需要设置为哪种模式,其实是用在U方法里生成url链接的时候用到的,访问的时候只要web服务器支持用哪种方式都可以。

也建议ThinkPHP其实不需要配置,而是记住用户访问的方式,只要第一个访问用的是哪种模式,以后生成的url都用这种方式生成,因为用户都已经访问到了就不存在支不支持的问题了。

 

如果正常的url不能达到我们的要求,还可以通过配置路由进一步优化url,例如我们想把url配置的更加简单

http://localhost/tp/Ucai/login/xxx

我们只需要在模块配置文件中添加如下的路由配置即可,如果用正则表达式则可以更加简化

 

'URL_ROUTE_RULES'   =>   array(
              'login/:para' => 'Ucai/User/index',
              'login' => 'Ucai/User/index',
       ),
 

 

到这里我们可以看到,ThinkPHP框架支持的层次结构和url配置非常丰富,能满足各种不同的需求。当然我们建议大家不要滥用路由配置,适当少量的配置能带来更好的seo效果,但是大量的配置会给项目的维护和修改带来困难。

 

二、ThinkPHP扩展

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

1、数据库驱动扩展

    虽然ThinkPHP提供了众多的数据库驱动,但是也并不能满足所有的需求。例如我们的数据很可能不是通过直接访问数据库去实现,而是通过一些中间件(例如C程序)进行转发,从而获得更好的性能,这时就需要扩展数据库驱动来支持。

    扩展非常简单,在DB/Driver目录下新建自己的驱动,例如Custom.php,然后实现requestexecute方法扩展就算完成了,然后再配置文件里配置DB_TYPE=’custom’,就可以使用了。这里的request表示查询,execute表示更改数据,所有其他操作都会在Model里进行解析,包装成sql语句调用这两个方法执行。

例如我所实现的最简单的query方式,通过shell命令调用sqlite执行sql语句:

 

public function query($str) {
        $cmd = sprintf('sqlite3 %s "%s"', $this->config['params']['dbfile'], $str);
        exec($cmd, $arr);
}

 

 

当然这个只是示例,ThinkPHP本身就支持sqlite3,通过pdo的方式去连接就可以。实际的应用环境可能是通过连接4层协议访问中间层端口获取数据。

2、Behavior行为扩展

    Behavior行为设计是ThinkPHP框架的核心,通过行为配置和扩展,为系统的伸缩性和定制性提供了最大的支持。假如我们要加入登录验证的功能,按照常规我们会设计自己的父类Controller,然后所有其他的Controller都从这里继承。但有了Behavior会变得更加简单和灵活,我们只需要在tags.php(没有的话在配置目录新建)添加一个Behavior就可以了:

 

return array(
       'action_begin' => array('Ucai\Behavior\AuthBehavior'),
       'view_begin' => array('Ucai\Behavior\OutputBehavior'),
);

 

 

程序在执行到action_begin流程时就会调用这个Behavior,我们可以根据状态进行跳转或终止执行。

 

namespace Ucai\Behavior;
class AuthBehavior {
     // 行为扩展的执行入口必须是run
     public function run(&$return) {
          //不需要验证的action设置为true
         if (!$return['AUTH_PUBLIC']) {
              if (service('User')->checkLogin())
              {
                     $return = true;
              }
              else
              {
                     header('Content-Type: text/html; charset=utf-8');
                     redirect(U('User/index', array('url' => $_SERVER['HTTP_REFERER'])), 5, '需要登录,5秒后跳转。。。');
              }
         }
     }
}

 

 

对于不需要登录的页面我们可以在Controller里添加配置,所有不配置的都会要求登录验证。

public $config = array('AUTH_PUBLIC' => true);

 

    这里大家对继承和Behavior实现登录验证做一个对比,可能觉得区别不大。但是在一个复杂的项目里,这种功能会非常多,如果每个功能都放到父类里,就会非常庞大,并且部分子类可能又不需要,这时候用Behavior去定制流程就会显得游刃有余。

    在上面的配置中我们还发现了一个配置OutputBehavior更能说明问题,大家有没有猜到,这个Behavior我是用来在view里输出一些共有变量,例如jscss的域名和路径等。在没有Behavior之前,大家是不是需要一个公共方法,然后每个页面都去调用一次,或者改写View的类代码?有了Behavior就显得方便许多。

 

namespace Ucai\Behavior;
class OutputBehavior {
     public function run(&$return) {
          $view = \Think\Think::instance('Think\View');
        $view->assign('STATIC_URL', 'http://p3.ucai.cn/static');
     }
}

 

 

扩展总结:通过Behavior扩展和数据库驱动扩展大家可以看到,ThinkPHP提供了很灵活的扩展和增强机制,能满足众多需求。其他存储、缓存、日志、模板引擎等如果需要也能很方便的扩展。

 

三、源码分析与不足

首先我们来分析一下框架执行的大致流程:

index.php(入口、调试模式、应用路径)

--> ThinkPHP.php(定义路径与访问模式)

--> Think\Think(类加载器、异常处理、读取共有配置)

--> Think\App(请求url调度解析、执行调度解析结果)

      --> exec 执行用户定义的ControllerAction方法

--> Think\Dispatcher(根据url模式解析MCA和参数,加载模块配置)

--> Think\Controller(调用视图、包装和重定向)

 

可以看到,框架的内部流程其实比较简单,还有2个很重要的类:

Think\Hook: 监听AppActionView的各个阶段,执行Behavior

Think\Behavior: 可配置(配置文件)可增删(代码)

 

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

1、宏定义过多,难于维护和修改

建议:只在个别文件定义极少数几个宏,其余用类常量包装

2、面向过程代码过多,封装不清晰

建议:用面向对象思想包装

例如:url的解析和包装,现在是在Dispatcher里生成__APP__宏,然后在U方法里读取宏并生成最终url。其实完全可以定义一个类来包装例如UrlHelper,而类的二个方法parsegenerate分别负责解析和生成url,这样代码结构会清晰很多。

3、有的函数和类代码封装过多,复用和改进不方便

建议:用组合来封装独立功能内容

例如:Model的校验功能,完全可以独立成类,也可以用于非Model对象调用。而现在的校验接口是Model的保护性方法,只能在Modelcreate函数调用,外面必须通过create方法才能校验。

4、代码规范和风格问题

希望代码风格能更加规范和标准,例如DB类作为模板方法的父类,应该用抽象方法或抛出异常形式定义所有Model需用到的方法。事实上有些方法子类是不需要的,而Db类却没有实现。

 

四、总结

    ThinkPHP作为国内热门的php框架,确实给我们的开发带来了便利。框架开发者对web流程理解的很透彻,对php的函数应用炉火纯青。框架定义了灵活的配置和扩展适应各种需求,提供了丰富的组件和模块来加速开发。最后说一点,ThinkPHP的文档和社区支持非常完善,这也是框架流行不可缺少的重要一环。我们也希望ThinkPHP以后能更加完善自身的结构,打造成最优秀的php框架。

 

0
0
分享到:
评论

相关推荐

    ThinkPHP框架设计及扩展详解

    本文详细介绍了ThinkPHP框架的框架分层及url路由、ThinkPHP扩展、数据库驱动扩展、Behavior行为扩展以及源码分析与不足,讲解的十分全面系统,这里推荐给大家,有想学习ThinkPHP的小伙伴千万不要错过。

    thinkphp框架帮助扩展类

    "ThinkPHP框架帮助扩展类"是指在ThinkPHP框架中,为了增强其核心功能或者解决特定问题而设计的一些自定义工具类。这些类通常被命名为"Util",表示它们是通用的实用工具,可以协助处理各种常见的编程任务。 "Excel...

    php企业thinkphp框架源码

    总结,ThinkPHP框架以其模块化的设计、强大的功能和友好的开发体验,成为PHP企业级应用开发的首选。理解并掌握上述各个组件的作用和用法,将有助于我们更高效地利用ThinkPHP构建复杂的企业级应用,提升开发效率,...

    thinkphp框架源码交易系统资源网站源码

    通过学习源码,开发者不仅可以提升ThinkPHP框架的使用技巧,还能借鉴优秀的代码设计思路,提高自身开发能力。 总之,基于ThinkPHP框架的源码交易系统资源网站源码,不仅是一个实用的开发工具,也是学习和研究的宝贵...

    供新手学习的thinkphp框架留言板

    在【标签】中,“thinkphp框架”是指这个项目的核心技术,它是一个用于快速开发PHP应用的工具,具有良好的扩展性和模块化设计,支持面向对象编程,让开发者可以快速构建稳定、安全的应用。“留言板”是实现的具体...

    ThinkPHP框架OA系统

    总结,基于ThinkPHP框架的OA系统开发是一项综合性的工程,涵盖了前端界面设计、后端业务逻辑处理、数据库操作以及安全性等多个方面。掌握好ThinkPHP框架,并结合OA系统的特性进行开发,可以创建出高效、稳定的办公...

    免费thinkPHP3.2.3框架

    总结,ThinkPHP3.2.3作为一款成熟的PHP框架,为开发者提供了便捷的开发工具和高效的工作流,无论是小型项目还是大型应用,都能游刃有余地应对。通过深入理解和实践,开发者能更好地发挥其优势,提高开发效率,实现...

    基于ThinkPHP框架的电影主题网站的设计与开发.docx

    基于ThinkPHP框架的电影主题网站的设计与开发 ThinkPHP框架是一个流行的PHP Web开发框架,具有快速、简洁、灵活和高效等特点。以下是基于ThinkPHP框架的电影主题网站的设计与开发的知识点: 一、ThinkPHP框架简介 ...

    基于thinkPHP框架的人力资源管理系统

    本文将深入探讨基于ThinkPHP框架的人力资源管理系统的设计与实现,旨在为初学者和有一定经验的开发者提供参考。 一、ThinkPHP框架简介 ThinkPHP是遵循Apache2开源协议发布的全栈式PHP框架,它的设计目标是提升开发...

    THINKPHP框架实例

    总结,ThinkPHP框架以其简洁的语法、丰富的功能和良好的社区支持,成为PHP开发者的首选之一。通过深入理解并实践"THINKPHP框架实例",开发者可以提升自己的Web开发技能,构建高效、稳定的业务系统。

    基于ThinkPHP框架开发的学生信息后台管理系统

    《基于ThinkPHP框架开发的学生信息后台管理系统》 ThinkPHP是一个广泛应用的开源PHP框架,它为开发者提供了快速、简单且强大的Web应用开发解决方案。这个项目是一个使用ThinkPHP框架构建的学生信息后台管理系统,它...

    thinkPHP框架

    ThinkPHP框架的设计理念是“简洁、实用、创新”,它遵循MVC(Model-View-Controller)架构模式,使得业务逻辑与表现层分离,提高了代码的可读性和可维护性。其核心组件包括路由、控制器、模型、视图、数据库等,这些...

    基于thinkPHP框架实现留言板的方法

    基于thinkPHP框架实现留言板是一个较为常见的开发实例,它能帮助开发者了解如何利用thinkPHP框架快速搭建出一个留言板系统。以下是详细知识点介绍: ### 知识点一:thinkPHP框架概述 ThinkPHP是一个轻量级的PHP开发...

    基于ThinkPHP框架的B2C网上商城设计与实现.pdf

    基于ThinkPHP框架的B2C网上商城设计与实现 本文主要介绍基于ThinkPHP框架的B2C网上商城的设计与实现。该系统基于PHP+MySQL技术,分析了B2C电子商务模式的要求和流程,设计了B2C网上商城的功能模块和数据库,并使用...

    thinkphp6框架下载

    2. **Composer管理**:`composer.json`是项目依赖管理的配置文件,ThinkPHP6框架的安装和扩展管理依赖于Composer。通过运行`composer install`命令,可以自动下载并安装所需的依赖库,确保项目环境的一致性。 3. **...

    thinkphp框架

    《深入理解ThinkPHP框架5.0.15版》 ThinkPHP是一款基于PHP语言的开源Web应用开发框架,它的5.0.15版本在原有的基础上进行了诸多优化和改进,旨在提升开发效率和代码质量。这个版本的核心特性包括模块化、路由、...

    基于thinkphp框架的cms系统

    《基于ThinkPHP框架的CMS系统深度解析》 在IT行业中,内容管理系统(CMS)是构建企业网站的关键工具,尤其对于那些需要频繁更新内容的企业来说,一个高效、安全且易于扩展的CMS至关重要。本文将深入探讨基于...

Global site tag (gtag.js) - Google Analytics