内容简介:本次更新了大量的细节,进一步统一和精简了用法,并且新增了一些功能。在正式版发布之前,不建议用于正式项目,目前也还没有完善的文档和详细的测试。相比较
本次更新了大量的细节,进一步统一和精简了用法,并且新增了一些功能。
在正式版发布之前,不建议用于正式项目,目前也还没有完善的文档和详细的测试。
主要更新
相比较 beta2
版本(
Beta2
版本更新参考这里
),除了一些修正和改进外,主要包含了如下的功能更新和调整。
视图和模板引擎从核心分离
视图和模板引擎类不再内置到核心框架,需要的时候可以单独通过
composer require topthink/think-view
安装,如果使用
composer create-project topthink/think
会默认安装该组件(如果不需要使用的话可以自己卸载 topthink/think-view
)。
安装后,由于内置的 think\Controller
类不再封装视图方法,如果你的控制器类需要调用 fetch
/ display
/ assign
等视图方法,必须继承 think\ViewController
类,使用 view
助手函数方式用法不变。
取消数据库的 setInc
/ setDec
/ setField
方法
原来的 setInc
/ setDec
/ setField
方法不再支持,使用 inc
/ dec
/ update
方法替代。例如:
Db::name('user')->where('id', 1)
->inc('exp')
->dec('score')
->update();
取消查询 eq/neq/gt/lt/egt/elt
表达式
由于存在两种用法,并且不够直观,全部统一为更直观的用法。
下面的用法不再支持
Db::name('user')->where('id', 'egt', 1)
->where('status', 'neq' ,1)
->select();
统一使用
Db::name('user')->where('id', '>=', 1)
->where('status', '<>' ,1)
->select();
取消分表功能
出于分表的性能问题和复杂性,不再提供分表方法,建议使用数据库的分区功能替代。
增加年/月/日的便捷日期查询方法
可以使用下面的便捷日期查询
// 查询2018年的博客数
Db::name('blog')->whereYear('create_time', '2018')->count();
// 查询2018年12月的博客数
Db::name('blog')->whereMonth('create_time', '2018-12')->count();
// 查询2018年12月24日的博客数
Db::name('blog')->whereDay('create_time', '2018-12-24')->count();
query
原生查询也可以支持查询缓存
使用query进行 SQL 语句查询的时候也可以支持查询缓存,例如:
Db::cache('cache_key')->query("select * from blog where create_time > '2018-12-1'");
如果使用了数据库的读写分离,需要从主库查询的话,需要使用
Db::master(true)->query("select * from blog where create_time > '2018-12-1'");
数据库的查询统计合并
数据库的查询次数合并到 queryTimes
,不再区分读写操作,你可以使用下面的方法获取当前请求的数据库查询次数(包括读写)
Db::getQueryTimes();
模型延迟自动保存
模型增加延迟保存方法 lazySave
,调用该方法后不会马上保存数据,仅仅是保存在内存中,当前模型对象销毁的时候或者下次显式调用 save
方法的时候都会自动保存到数据库。
$user = User::find(1); $user->name = 'thinkphp'; $user->lazySave(); ... $user->score = 100; $user->save();
模型事件调整
模型事件不再支持使用 event
方法注册事件,统一使用模型事件观察者类,你只需要在模型定义或者初始化的时候设置 observerClass
属性。
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $observerClass = 'app\index\observe\User';
}
所有的模型事件统一在观察者类中进行定义,方法的命名规范如下:
<?php
namespace app\index\observe;
class User
{
public function onAfterRead($user){
$user->extra = 'extra';
}
public function onBeforeWrite($user){
$user->extra = 'extra';
}
}
并且模型增加 after_read
事件,在查询后创建模型对象实例的时候触发。
模型属性和数据表字段的对应关系
默认情况下,模型对象数据字段严格区分大小写,你可以关闭严格模式(前提是必须保持数据表字段的小写和下划线定义规范),然后在模型中使用的时候,如果使用驼峰命名调用,则会自动转换为小写和下划线规范的字段(关连模型除外),例如:
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $strict = false;
}
然后,下面的代码
$user = User::find(); echo $user->nick_name; $user->nick_name = 'test'; $user->save();
和下面的用法是等效的
$user = User::find(); echo $user->nickName; $user->nickName = 'test'; $user->save();
如果你的数据表字段不符合规范(存在大小写混合使用的情况),那么必须在模型中开启 strict
属性。
增加乐观锁功能
和软删除一样,增加了一个 think\model\concern\OptimLock
Trait用于方便引入扩展模型的乐观锁功能。
<?php
namespace app\index\model;
use think\model\conern\OptimLock;
use think\Model;
class User extends Model
{
use OptimLock;
protected $optimLock = 'lock_version';
}
增加 PSR-11
支持
支持 PSR-11
规范,增加 psr/container
依赖, Container
类增加 pull
方法替代之前的静态 get
方法。
增加闭包数据的缓存序列化支持
添加了 opis/closure
依赖用于支持闭包的序列化支持。
增加自动多应用支持
支持在同一个入口文件中访问多个应用,并且支持应用的映射关系以及自定义。
例如在 index.php
入口文件中使用:
(new App())->autoMulti()->run()->send();
就可以不必创建入口文件自动通过URL访问多个应用
http://serverName/index.php/admin
如果你的默认应用不是 index
(默认为入口文件名),那么可以通过 name
方法指定默认应用。
(new App())->autoMulti()
->name('admin')
->run()
->send();
支持应用名的别名映射,例如:
(new App())->autoMulti([
'think' => 'admin', // 把admin应用映射为think
])->run()->send();
如果需要对某个应用进行自定义,可以使用
(new App())->autoMulti([
'admin' => function($app) {
$app->debug(true)->useClassSuffix();
}
])->run()->send();
取消别名路由
因为使用场景有限和性能开销问题,取消原来的别名路由功能,建议使用资源路由或者单独的路由替代。
取消快捷路由
因为使用场景有限和不太符合规范,取消了原来的控制器快捷路由功能。
取消空操作功能
建议使用分组MISS路由功能替代。
应用类库后缀规范
取消了 controller_suffix
和 class_suffix
配置参数,App类增加了 controllerSuffix
方法用于开启控制器类库的 Controller
后缀(默认不开启)。其它应用类库的后缀由项目自己决定,框架不再强制规范。
需要注意的是,如果你的模型类命名使用了 Model
后缀的话,一定要定义 name
属性或者 table
属性。
异常响应输出类型
增加 exception_response_type
配置参数用于设置异常响应输出的类型,默认为 html
类型。如果你的应用全部用于接口开发,可以配置为 json
类型。
更新日志
路由
-
路由检测作为
AppInit事件响应独立出App类,可配置事件定义文件不使用路由功能 -
路由定义的方法简化
option和pattern参数,统一使用方法进行路由参数和变量规则设置 -
取消别名路由和快捷路由功能
-
取消多级控制器的自动搜索功能
-
路由分组不再支持数组方式定义分钟下面的路由规则
-
取消路由的
mergeExtraVars方法和设置 -
提升路由变量替换的性能
-
判断路由规则定义添加对请求类型的判断
-
路由地址支持
Dispatch对象
数据库和模型
-
改进模型的数据类型强制转换对
Expression对象的支持 -
模型查询统一返回对象 取消
findOrEmpty方法 模型类增加isEmpty方法 -
增加
raw助手函数 -
修正
mysql的regexp查询 -
改进聚合查询方法的
field参数支持Expression -
where方法支持传入Query对象 -
改进
Connection类getRealSql方法 -
Query类
cache方法支持传入CacheItem类 -
Query类
find/select/cursor方法不再支持闭包 -
模型增加
lazySave方法 用于延迟自动保存 -
统一模型数据的读取和写入,支持驼峰和下划线自动智能识别
-
取消数据库的分表功能支持
-
改进
join方法支持参数绑定 -
取消
setInc/setDec方法和setField方法 -
模型增加
strict属性 支持开启字段区分大小写 默认不区分,数据库字段强制使用小写 -
取消查询方法的
eq neq lt gt elt egt等表达式 -
统一模型事件为使用模型事件观察者 废弃
event方法注册模型事件 -
增加
after_read模型事件 -
增加
whereYear/whereMonth/whereDay查询方法 -
Query类
query方法支持查询缓存 -
增加
procedure方法用于指定是否为存储过程调用 -
简化
cursor、query和execute方法参数 -
废弃数据库执行次数 合并到查询次数
-
Connection类
getCursor方法调整 取消relation参数 -
取消一对一关联的
setEagerlyType方法 -
改进软删除
destory方法重复执行事件的问题 -
修正多对多中间表的写入
-
改进关联模型的
save方法 -
增加乐观锁
Trait
控制器
-
取消
ActionBegin事件 -
改进控制器中间件执行
-
修正控制器名称获取
-
改进App类的
useClassSuffix方法的默认值 -
取消
controller_suffix配置,改用App类的controllerSuffix方法设置 -
取消
url_controller_layer配置,改用App类的controllerLayer方法设置 -
取消
class_suffix配置 -
取消
App类的action方法 -
取消
empty_controller配置,改用App类的emptyController方法设置 -
取消空操作
缓存
-
改进缓存
CacheItem类增加expire和tag方法支持 -
改进
CacheItem类getExpire方法 -
改进
CacheItem的缓存有效期处理 -
改进缓存类的
remember方法 -
FIX:当使用
complex缓存的时候,通过store方法选择驱动,提供给connect的参数类型错误 -
改进 Redis 缓存驱动的
tag支持 -
改进
Redis驱动 -
改进缓存类 取消
xcache驱动 -
改进缓存标签的获取
-
增加缓存序列化的闭包支持
验证
-
改进
unique验证方法 -
改进验证类的自定义验证正则
-
验证方法调整
-
增加
validate助手函数
其它
-
改进
Cookie类的setCookie方法 -
App类增加classBaseName方法 -
改进
Url生成的端口问题 -
修正
Request类param方法 -
语言检测、路由检查、请求缓存功能独立作为事件响应
-
Request增加单独的middleware方法传递中间件变量 -
取消
App类的log方法 -
增加
exception_response_type配置参数
以上所述就是小编给大家介绍的《ThinkPHP 发布 5.2 Beta3 版本》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Data Mining
Bing Liu / Springer / 2011-6-26 / CAD 61.50
Web mining aims to discover useful information and knowledge from Web hyperlinks, page contents, and usage data. Although Web mining uses many conventional data mining techniques, it is not purely an ......一起来看看 《Web Data Mining》 这本书的介绍吧!