内容简介:本次更新了大量的细节,进一步统一和精简了用法,并且新增了一些功能。 在正式版发布之前,不建议用于正式项目,目前也还没有完善的文档和详细的测试。 主要更新 相比较beta2版本(Beta2版本更新参考这里),除了...
本次更新了大量的细节,进一步统一和精简了用法,并且新增了一些功能。
在正式版发布之前,不建议用于正式项目,目前也还没有完善的文档和详细的测试。
主要更新
相比较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 版本》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- IJPay 0.8 版本发布,兼容低版本 JDK
- fastjson 1.2.55 版本发布,Bug 修复版本
- Apache Ignite 2.9.1 版本发布,小版本更新
- Swoole v4.6.1 版本发布,Bug 修复版本
- Swoole v4.6.2 版本发布,Bug 修复版本
- Swoole v4.6.4 版本发布,Bug 修复版本
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
产品经理手册(原书第4版)(白金版)
[美] 琳达·哥乔斯(Linda Gorchels) / 祝亚雄、冯华丽、金骆彬 / 机械工业出版社 / 2017-8 / 65.00
产品经理的职责起点是新产品开发,贯穿产品生命周期的全过程。本书按上下游产品管理进行组织。 在上游的新产品开发流程中,作者阐述了如何从市场、产品、行业、公司的角度规划企划方案,并获得老板、销售部、运营部的资源支持,推进新产品的项目流程,实现所有目标,制定和实施新产品发布。 下游产品的管理核心在于生命周期的管理,营销更是生命周期管理的重中之重。产品经理如何让产品满足客户需求,让客户获得对产......一起来看看 《产品经理手册(原书第4版)(白金版)》 这本书的介绍吧!