PHP学tp5还是tp6,ThinkPHP6.0.2 手记 TP5升级到TP6

手记:入口文件和应用都是隐形调用的,路由规则定义的是显性的pathinfo部分,最后附带Query部分,这里含参数。

补充URL的构成(参考Linux方式):

scheme://name:password@host:port/path?query#fragment:

(1).scheme:通信协议,常用的http,ftp,maito等。

(2).verify:用户名和密码等。(这部分内容流行以表单内容、表头信息Head作为载体传送)

(3).host:主机,服务器(计算机)域名系统 (DNS) 主机名或 IP 地址。

(4).port:端口号,整数,可选,省略时使用方案的默认端口,如http的默认端口为80。

(5).path:路径,由零或多个"/"符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。

(6).query:查询,可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技术制作的网页)传递参数,可有多个参数,用"&"符号隔开,每个参数的名和值用"="符号隔开。

(7).fragment:信息片断,字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。(也称为锚点)

————————————————

版权声明:本文为CSDN博主「PPBY」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/singlepepper/article/details/50981743

路由定义文件位置调整

单应用模式下,路由定义文件和之前一样就在route目录下面,如果你的项目是采用了多应用模式的话,每个应用的路由定义和匹配都是独立的,也没有模块的概念,路由定义文件的位置应该是在应用/route下面,例如:

app/index/route/route.php//  index应用的路由定义文件

app/index/route/web.php//  index应用的第二个路由定义文件

app/admin/route/route.php// admin应用的路由定义文件

应用的路由规则其实是定义的入口文件(或者应用名)后面的URL部分,而不包含应用。

手记:新版采用的匹配路由规则的底层架构,并且route.php文件的配置项默认值是true

// URL普通方式参数 用于自动生成

'url_common_param'      => true,

如果你的路由定义采用的是返回数组形式,全部改成方法定义。

例如:

return['hello/:name'=>'index/hello',];

必须改成:

Route::get('hello/:name','index/hello');

如果路由定义方法(包括rule/get/post/put/delete/patch/miss/group等方法)使用了option和pattern参数,全部改成方法调用形式,例如原来的:

Route::get('hello/:name','index/hello',['ext'=>'html'],['name'=>'\w+']);

需要改成

Route::get('hello/:name','index/hello')->ext('html')->pattern(['name'=>'\w+']);

手记:路由分组的参数采用了对象的方式。

路由分组调整

如果路由分组定义使用了数组,改成闭包方式定义,例如:

Route::group('blog',[':id'=>'Blog/read',':name'=>'Blog/read',])->ext('html')->pattern(['id'=>'\d+']);

必须改成

Route::group('blog',function(){Route::get(':id','Blog/read');Route::get(':name','Blog/read');})->ext('html')->pattern(['id'=>'\d+']);

如果你需要注册一个虚拟的路由分组,可以直接在第一个参数使用闭包

Route::group(function(){Route::get('blog/:id','Blog/read');Route::get('user/:name','User/read');})->ext('html')->pattern(['id'=>'\d+']);

手记:框架底层的扩展采用的都是注入的方式,先在App容器中注册,再以注册Service方式调用实例执行。

取消Request类的hook方法

该方法已经在最新版本中取消。如果你使用了该功能,在自定义请求对象app\Request中直接增加相应的方法即可。并确保provider.php文件中添加如下绑定:

'think\Request'=>\app\Request::class,

手记:在模型文件的内部,模型一定会执行获取器、搜索器和修改器的机制,为确保程序的可控性,要使用模型内部方法getAttr()获取数据

如果你是在模型内部获取数据,请不要使用$this->name的方式来获取数据,请使用$this->getAttr('name') 替代。

手记:形参是模型对象自身,实参是模型对象变量

模型事件调整

模型事件不再需要使用event方法注册事件,统一在模型类中定义事件方法,例如

namespace app\index\model;

use think\Model;

classUserextendsModel

{

publicfunctiononAfterRead($user)

{

$user->extra='extra';

}

publicfunctiononBeforeWrite($user)

{

$user->extra='extra';

}

}

手记: 模型save方法和update方法的区别在于是否有where参数

save(['name'=>'哈哈','role'=>'1']);   //方法不支持where条件的传入

update([['name'=>'哈哈','role'=>'1'],['id','1']]);    //第二个参数是where条件

手记:新版参数大多数采用了数组形式,这源于底层框架的数据传递都是以对象的形式。所以大多数跨实例操作时,传参要数组格式优先。

手记:数据集是在模型和数据库查询器之后的数据容器,会对数据打包成结果集对象。

模型和数据集的输出调整

取消hidden/visible/append方法的第二个参数,当你调用这几个方法的时候,无论模型是否设置了相关属性,都会直接覆盖之前设置的值。

手记:cache中传入的一定要是一个结果集的属性,原因参考楼上的数据集手记

查询缓存调整

如果希望在更新和删除之后自动清除之前的查询缓存,必须在cache方法中传入key值而不是true。

手记:使用join方式,默认可采用withjoin

withJoin方法默认使用的是INNERJOIN方式,如果需要使用其它的,可以改成

$users=User::withJoin('profile','LEFT')->select();foreach($users as $user){echo $user->profile->name;}

需要注意的是withJoin方式不支持嵌套关联,通常你可以直接传入多个需要关联的模型。

如果需要约束关联字段,可以使用下面的简便方法。

$users=User::withJoin(['profile'=>['user_id','name','email']])->select();foreach($users as $user){echo $user->profile->name;}

手记:Session默认不是开启的,需要在App应用根目录中开启Service

获取全部Session已由get()改为all()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值