ThinkPHP5.1
从2018年初发布到现在,一路小步快跑,快速迭代的同时也更新了大量的新特性。
那么到底是否值得升级到新版呢?如果你还在纠结选用5.0的商城系统还是选用thinkphp 5.1的系统,本文就和大家分享下值得升级到
5.1
的18个理由。
- 1、快速启动测试服务器:直接跨过门槛学框架
2、对象容器引入和依赖注入改进:实用高逼格
3、增加门面对象:类的小助理
4、路由更对象化:又双叒叕提速?
5、注解路由:定义路由新姿势
6、跨域请求更简单:漂洋过域来看你
7、引入中间件支持:分工更明确
8、搜索器:查询利器化繁为简
9、生成器:缓解大数据查询的内存开销
10、数据集增强:用过都说好
11、JSON字段查询:就是如此简单
12、动态定义获取器:Db类也可以用获取器
13、数组对象查询:既有情怀又够贴心
14、查询为空的改进:懒人真多
15、Swoole/Workerman支持:如虎添翼
16、验证类改进:对象化定义验证规则
17、配置和路由定义独立目录:地位提升
18、改进的日志支持:更好用了呗
总结:升级无悔,再战五百年
1、快速启动测试服务器:直接跨过门槛学框架
新手服务器环境不会搭?pathinfo
不支持?告别这些烦恼吧,5.1
内置了一个快速启动测试服务器的指令,你只需要在命令行下切换到项目根目录下面输入:
php think run
即可在localhost:8000
启动一个测试服务器,而无需任何其它的WEB服务器环境,告别新手搭建环境各种问题的困惑。
相比较而言,在5.0
中,必须使用
php -S localhost:8000 public/router.php
当然,该指令也支持指定端口和地址(域名),下面就是指定通过tp.com
(需要自己添加host)域名的80端口访问。
php think run -H tp.com -p 80
2、对象容器引入和依赖注入改进:实用高逼格
5.1
正式引入了对象容器,可以更方便的快速存取对象和管理依赖注入。这是5.1
基础架构的一大调整,5.0没有容器的概念,所有的依赖对象都在请求对象中,依赖注入虽有支持但不够规范也不通用化。有了容器对象,所有的依赖对象都可以在容器里面进行统一的实例化或者绑定,需要的时候可以直接拿出来,对于解耦和减少直接依赖很有帮助。
5.1
的应用类think\App
本身就是容器,同时还充当了容器的管理对象,你不需要直接操作容器类就能对容器中的对象实例进行存取。而App类通常是在入口文件中实例化的,也就是说在App类实例化的同时,这个容器对象就已经准备好了。
而App类本身也提供了门面方式的静态调用,因此,你可以像下面一样方便调用。
use think\facade\App;
// 绑定对象实例到容器
App::bindTo('myClass',$obj);
// 为了避免容器过大 通常只是绑定一个类而不是对象
App::bindTo('myClass','namespace\ClassName');
// 快速获取对象实例
$obj = App::make('myClass');
// 无需绑定操作即可获取对象实例
$obj = App::make('namespace\ClassName');
容器对象中的实例默认都是单例的,如果你需要获取新的对象实例,可以在make的时候指定总是重新实例化
// 创建一个新的对象实例
$obj = App::make('namespace\ClassName',true);
// 如果需要实例化的时候传入参数,则使用
$obj = App::make('namespace\ClassName', ['name' => 'think'], true);
当然,这个只是容器内部的调用机制,实际到应用层面,大多数时候容器对象实例的获取是在依赖注入的时候自动完成的,因此你可能根本不需要用到上面的代码或者说关心容器的存在。下面就是一个典型的依赖注入的例子:
<?php
namespace app\index\controller
use namespace\ClassName;
class My
{
// 调用test操作方法的时候会自动从容器中获取ClassName对象实例
public function test(ClassName $class){
// 调用对象的方法或者获取属性
$class->fun();
}
}
ThinkPHP5.1
没有服务提供者的概念,如果你需要对容器中的对象进行自定义实例化,可以在你的对象中添加__make
静态方法来完成。
use think\App;
class ClassName
{
/**
* 名称
* @var string
*/
protected $name;
/**
* 构造方法
* @access public
*/
public function __construct($name = '')
{
$this->name = $name;
}
public static function __make(App $app)
{
$name = $app['config']->get('app_name');
return new static($name);
}
}
现在当你在操作方法中依赖注入ClassName对象(或者通过容器的make方法获取对象实例)的时候,就会自动调用__make
方法进行自定义实例化。
正因为容器的引入,使得
5.1
的依赖注入得以更加完善,并且支持了更多的依赖注入的场景,包括控制器架构函数,操作方法,事件响应,路由定义,模型事件等等。
3、增加门面对象:类的小助理
5.1
的核心类基本上都改造成了动态类,对需要提供静态调用的类则改为提供门面对象支持,好处是可以更好的支持单元测试,由于容器的支持而使得门面对象天生具有单例的特性。
但因为用法的改变同时也让门面变成了
5.0
升级到5.1
最大的障碍,因为你不得不调整类库的引入。
很典型的5.0
中经常使用的Route
类、Session
类在5.1
中类的方法本身没有变化,只是不再是原来的think\Route
和think\Session
静态类,必须改成门面静态代理类:
use think\facade\Route;
use think\facade\Session;
Route::rule('hello/:name','index/hello');
Session::get('user_name');
和依赖注入一样,通过门面对象操作的时候会自动获取容器中的对象实例(如果不存在的话则会自动实例化),因此你不用关心对象是如何实例化的。你操作think\facade\Route
就和操作think\Route
类是一个效果(除了使用的是静态方法之外)。门面对象唯一的不足是对IDE的自动提示不够,但可以通过给门面类添加注释解决,系统内置的门面类均有自动提示。
4、路由更对象化:又双叒叕提速?
5.1
的路由基本上完全重构了,但最大程度的保留(或者说兼容)了5.0
的用法,把原本的一个Route
类拆分成独立的多个职责明确的类库,并且优化了路由匹配的算法,而且支持路由解析的缓存,极大提升了路由的性能。
路由规则的变量用法改进
路由定义方面主要对域名路由和路由分组的功能进行了强化,以及路由规则的更灵活定义。
之前的路由规则中变量分两种,普通变量和组合变量定义,新版把这两种合二为一了(也就是说两种变量没有任何区别,仅仅是表现方式不同,而且是出于兼容考虑)。你现在完全可以在路由规则中以任何方式定义路由变量。
例如你可以使用下面的路由规则而不用管目前的UR