+ -
当前位置:首页 → 问答吧 → 新版ThinkPHP的变化

新版ThinkPHP的变化

时间:2011-11-19

来源:互联网

这里说的新版ThinkPHP,还未发布,需要通过SVN获得。下一版本可能是3.0。
  新版TP,又做了大量的优化。
  取消了以前的部署模式,部署模式时会直接进入allinone模式, 现在只有调试模式和allinone模式。  也就是说核心编译缓存始终只会生成一个文件(以前的部署模式会生成两个文件)。而且将项目函数和路由也编译到了核心缓存中。 TP的路由也是我们经常使用的功能,现在正式被归为了核心文件, 它的位置也从以前的Util文件夹移动到了Core文件夹。
  同时新版TP 还移除了一些不常用的功能, 清理了一些多余代码(如在编译模版时对模版过期时间的判断,以前有很多重复判断的地方,现在都已经清除)
  新版TP使用方法的变化,主要体现在:配置、模型、控制器等方面。

一,配置的变化
  1,开启调试。
     新版TP,开启调试已经不是通过配置文件来配置,而是在入口文件定义常量: define('APP_DEBUG',ture) 。
     新版TP 已经不再有STRIP_RUNTIME_SPACE 和 NO_CACHE_RUNTIME 常量,  定义APP_DEBUG 后就已经具有了NO_CACHE_RUNTIME的效果。
    注: 新版TP已经取消了对配置文件修改时间的判断。 在没有开启调试的情况下,如果修改了配置文件,需要手动删除runtime核心缓存。

   2,增加的配置项。
      DEFAULT_FILTER, 安全过滤函数,默认为htmlspecialchars。 当在控制器中使用$this->_get('name')或者$this->_post('name')时, 获得的get或post参数就会被DEFAULT_FILTER定义的函数过滤一次。
      TOKEN_RESET,令牌验证验证失败时是否重置令牌验证的session值。默认为ture。
      TMPL_DENY_PHP,是否禁止模版中使用PHP原生代码, 默认为false。
      LANG_LIST, 设置允许切换的语言包,如果选择的语言包没有在这个列表内,则使用默认语言包。
  3,默认值被修改的配置项。
      TMPL_STRIP_SPACE 的默认值改为了true,也就是说在默认情况下模版编译缓存就会被压缩。
      TMPL_ACTION_ERROR和TMPL_ACTION_SUCCESS 默认值改为了THINK_PATH.'/Tpl/dispatch_jump.html', 我们在默认情况下使用$this->error(msg)和$this->success(msg) 时也不会出错。
      DB_PORT 配置项默认值改为空。
  4,删除的配置项。
    APP_DEBUG,APP_DOMAIN_DEPLOY,PAGE_ROLLPAGE,PAGE_LISTROWS,URL_PATHINFO_MODEL,APP_AUTOLOAD_REG

  5,取消的配置文件。
    (1)新版TP已经取消了以下配置文件:taglibs.php(标签库定义),modules.php(扩展模块), actions.php(扩展操作)
    虽然取消了taglibs.php, 用户依然可以在模版中使用<tagLib name="xxx"/>的方式导入标签库。 标签库文件(tagLibXxx.class.php)需要放在ThinkPHP\Lib\Think\Template\TagLib 下 或者用别名导入。
alias_import('Xxx',APP_PATH.'/lib/tab/tagLibXxx.class.php')
     (2)模块配置已取消。定义 控制器名_config.php 的配置文件 将不起作用。
  6,增加动态配置文件。
       在Conf文件夹下可以建立一个 extend.php,  在里面定义的配置项 将不会被编译到核心缓存中,所以用户可以在这个文件中进行一些动态的判断, 如果我们要到达被取消了的模块配置的效果, 可以在 exntend.php 文件中定义
  1. if(strtolower(MODULE_NAME)=='index'){
  2. //如果是index控制器,返回index控制器独有的配置
  3. return array(
  4. '配置项'=>'值'
  5. )
  6. }else{
  7. return array();
  8. }
复制代码
二,模型的变化。
  1,令牌验证。 以前的TP的令牌验证有很多问题:(1)只要有session值就会通过,不能完全杜绝站外提交表单的现象,(2)当打开多个网页时, 返回提交以前打开网页的表单也会出现令牌验证错误。
    新版TP的这些问题都已经解决。 每次验证通过后会删除session值, 杜绝站外提交表单。 每个页面的令牌验证session名称各有不同, 解决同时打开多个窗口的问题。
    但是新版令牌验证, 如果使用ajax无刷新重复提交表单会有问题。
  2,自动验证。
    自动验证的附件规则, 除了function,callback,confirm,equal,in,unique, 还增加了:between,length,expire,ip_allow, ip_deny。    特别是 length, 我们以前判断一个字段长度 总要自定义函数来判断。 现在已经有内置规则了,方便多了。
  3,增强多数据库支持。
在模型初始化时就可以定义数据,连接信息,表前缀。 如 M('db.Name','think_','dbconfig'),  dbconfig为配置项名。 如在配置文件中定义:
dbconfig=> array(
'DB_HOST'   => 'localhost', // 服务器地址
    'DB_NAME'  => 'xxx',          // 数据库名
    'DB_USER' => 'root',      // 用户名
    'DB_PWD'=> '',          // 密码
    'DB_PORT'=> 3306,        // 端口
    'DB_PREFIX' => 'think_',    // 数据库表前缀
);
   4,新增缓存查询。
   新增一个连贯操作方法:cache, 能使查询结果缓存如: M('Xxx')->cache()->select()。  可设置缓存时间, 如果不设置默认是永不过期。, 所以刚才那个查询语句 只会读取一次数据库。 以后查询都是读取缓存。  设置缓存时间: M('Xxx')->cache(true,60)->select(), 表示缓存60秒。 , 还可以设置缓存类型M('Xxx')->cache(true,60,'Memcache')->select()。  可以给缓存命名: M('Xxx')->cache('name',60,'Memcache')->select()
   5,新增联合查询方法: union
     如 M('Table1')->union(M('Table2'))->select();
     目前有个bug:Model是不是差了一个getProperty方法?
   6,where方法增强, 可以在where方法的数组使用特殊字符“|”和“&”
  1. $where['title|content']=array('like','%kw%');
  2. M('xxx')->where($where)->select();
  3. //查询title或者content中有kw的数据。如果“|”改为“&” 表示 查询title和content都有kw的数据。
复制代码
7,join方法增强
     join方法中,可以使用不带前缀的表名, 如 M('Xxx')->join('__tablename__ on ....') ; 这里会把 __tablename__ 自动替换为 表前缀+tablename+表前缀。  以前我们在join中只能写表全名。
     建议table方法也增加这个功能, M()->table('__tablename__')  也能自动加上前后缀。
   8,新增getFieldBy方法。
   如M('Xxx')->getFieldByUid('2','name'); 会返回uid为2的name字段的值。
   9,增加了_sql方法。
      _sql方法 是 getLastSql的别名, 使用起来更加方便简单。
   10,增加了patchValidate属性。
    当 patchValidate属性为true时,自动验证会返回所有字段的错误。 在以前模型的自动验证每次只能返回一条错误。 新版TP 设置模型patchValidate为出, 返回的自动验证错误信息为一个数组, 数组形式为 array('字段1'=>'错误信息1','字段2'=>'错误信息2')
   11,删除了tableSuffix属性.

   12,新增MongoModel, TP开始支持nosql

三,控制器的变化。

  1,变量过滤。
   控制器中可以使用_get,_post,_put,_request,_session,_cookie,_server,_globals 方法来获得相应变量, 并能被安全过滤, 默认的安全过滤函数为htmlspecialchars, 由DEFAULT_FILTER配置项配置。你也可以自己指定过滤函数, $this->_get('变量名称','过滤函数名称','默认值')

  2,判断提交方式。
  可以使用以下方法来判断相应的提交方式:ispost,isget,ishead,isdelete,isput
3,新增__hack_module函数。
   在以前, 当访问的控制器不存在时,系统会定位到Empty控制器上, 新版TP,提供了__hack_module函数, 你可以定义一个__hack_module函数, 返回一个Action对象, 当控制器不存在时, 会定位到__hack_module函数访问的控制器上面。

四,其他
   1,路由: 新增路由跳转配置:array('简单路由或者正则定义','[redirect]','跳转地址','状态码')
   2,include标签。 在模版中的include标签,可以使用自定义属性, 替换被包含模版中格式为[var]的变量。 如 <include file="xxx" varname="value"/>  则被导入的模版中 [varname] 标签会被替换为 value
   3,函数:  系统函数增加了get_client_ip函数,可用到用户ip。 用户可以在Common文件下 建立extend.php  动态函数库,此函数库不会被编译到核心缓存文件中。
   4,模式(Mode), 新增rest, TP开始支持restful。

应该还有很多我没有说到的地方,大家可以查看SVN的日志。
另外, SAE版ThinkPHP也做了同步更新, 并增加了本地模拟器功能, 在本地环境下也可以使用新浪SAE的服务,如 storage, KVDB等等,   比如 在代码中出现  new SaeStorage()  本地环境也不会报错, 也能看见效果。 实现SAE完全在本地化开发。 欢迎大家测试。

作者: luofei614   发布时间: 2011-11-19

这是一个好消息,越改越好啊

作者: byyy521   发布时间: 2011-11-19