视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
ThinkPHP5.2:路由的调整和改进
2020-11-03 18:22:49 责编:小采
文档


例如:

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

必须改成:

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

多应用的路由定义文件位置

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

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

默认的URL规则变成了

http://域名/入口文件(或者应用名)/控制器名/操作名

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

自动多应用

最新的5.2版本可以支持在同一个入口文件中访问多个不同的应用(之前必须每个应用添加一个对应的入口文件)。

例如在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路由功能替代,而且可以支持给不同的路由分组设置MISS路由。同时废弃empty_controller配置。

取消控制器自动搜索

由于性能原因,取消了路由的多级控制器自动搜索功能,请在路由规则定义中明确指定要路由的多级控制器。

路由功能设计

路由功能不再固定执行,而且设计成为AppInit事件的响应监听,并且可以在项目的事件定义里面配置,系统默认的定义配置如下:

return [
 'bind' => [
 ],
 'listen' => [
 'AppInit' => [
 'thinklistenerLoadLangPack',
 'thinklistenerRouteCheck',
 ],
 'AppBegin' => [
 'thinklistenerCheckRequestCache',
 ],
 'ActionBegin' => [],
 'AppEnd' => [],
 'LogLevel' => [],
 'LogWrite' => [],
 'ResponseSend' => [],
 'ResponseEnd' => [],
 ],
 'subscribe' => [
 ],
];

在AppInit事件中会执行thinklistenerRouteCheck类,如果你的应用完全不需要使用任何的路由功能,可以在配置文件中取消定义即可,系统会执行默认的URL调度(也即是控制器/操作)。

取消注册方法的option和pattern参数

取消路由注册方法(包括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+']);

取消了url_controller_layer配置

改为在入口文件中使用controllerLayer方法设置。

(new App())->controllerLayer('Action')
 ->run()
 ->send();

取消class_suffix配置

改为在入口文件中使用useClassSuffix方法设置。

(new App())->useClassSuffix(true)
 ->run()
 ->send();

同时取消controller_suffix和class_suffix配置参数。

取消mergeExtraVars方法和对应参数

改为在路由规则中明确指定变量规则。

header方法参数类型调整

由于强类型约束的原因,header方法改为仅支持数组参数传入。

使用强类型参数

由于全面启用强类型参数,并且使用严格模式,所以一定要注意参数的类型。

众多ThinkPHP入门教程,尽在PHP中文网,欢迎在线学习!

本文转自:https://blog.thinkphp.cn/916515

下载本文
显示全文
专题