1.6升级指南
升级前请做好备份,执行以下命令升级
composer config -g --unset repos.packagist
composer require workerman/webman-framework ^1.6.6 -W
webman-framework 发布1.6.0版本
新增特性
要求PHP>=8.0
支持通过控制器参数获取输入
<?php
namespace app\controller;
use support\Response;
class UserController
{
public function create(string $name, int $age, float $balance, bool $vip, array $extension): Response
{
return json([
'name' => $name,
'age' => $age,
'balance' => $balance,
'vip' => $vip,
'extension' => $extension,
]);
}
}
访问 /user/create?name=tom&age=18&balance=100.5&vip=1&extension[foo]=bar
得到结果
{
"name": "tom",
"age": 18,
"balance": 100.5,
"vip": true,
"extension": {
"foo": "bar"
}
}
同时参数支持绑定类包括模型,例如
<?php
namespace app\controller;
use app\model\User;
class UserController
{
public function create(User $user): int
{
$user->save();
return $user->id;
}
}
更多参考控制器参数绑定
支持控制器中间件
<?php
namespace app\controller;
use app\middleware\MiddlewareA;
use app\middleware\MiddlewareB;
use support\Request;
class IndexController
{
protected $middleware = [
MiddlewareA::class,
MiddlewareB::class,
];
public function index(Request $request): string
{
return 'hello';
}
}
支持 Route::fallback()->middleware(...); 给4xx请求增加中间件
正常情况下404请求不会走任何中间件,从1.6.0版本开始可以给4xx请求设置中间件
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 not found']);
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
支持 Route::disableDefaultRoute()关闭特定应用、控制器的默认路由
// 禁用主项目默认路由,不影响应用插件
Route::disableDefaultRoute();
// 禁用主项目的admin应用的路由,不影响应用插件
Route::disableDefaultRoute('', 'admin');
// 禁用foo插件的默认路由,不影响主项目
Route::disableDefaultRoute('foo');
// 禁用foo插件的admin应用的默认路由,不影响主项目
Route::disableDefaultRoute('foo', 'admin');
// 禁用控制器 [\app\controller\IndexController::class, 'index'] 的默认路由
Route::disableDefaultRoute([\app\controller\IndexController::class, 'index']);
支持 $request->setGet() $request->setPost() $request->setHeader() 覆盖get post headers 数据
$request->get(); // 假设得到 ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // 最终得到 ['name' => 'tom']
// 以下类似
$requset->setPost();
$request->setHeaders();
view() 支持省略模板参数以及绝对路径
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
// 等价于 return view('user/hello', ['name' => 'webman']);
// 等价于 return view('/app/view/user/hello', ['name' => 'webman']);
return view(['name' => 'webman']);
}
}
其它配置及文件变动
新版本 config/server.php 的listen等配置移动到了 config/process.php 下,只影响 composer create-project 创建的新项目,老项目升级不影响。
新版本将 process 目录移动到了 app/process ,只影响 composer create-project 创建的新项目,老项目升级不影响。
升级注意
如果之前的项目代码不是很规范,可能会有一些兼容问题,主要问题如下:
检查view()函数使用
检查要升级的项目中view()是否有以/
开头的模板参数,有的话把开头的/
去掉,例如
return view('/user/index');
// 需要改成
return view('user/index');
检查自定义路由参数是否一致
Route::any('/user/{name}', function (Request $request, $myname) {
return response($myname);
});
// 需要改成
Route::any('/user/{name}', function (Request $request, $name) {
return response($name);
});
注意 $request 参数前面需要添加Request类型提示。
关闭composer代理
阿里云等composer镜像代理有延迟,里面的包的版本可能不是最新的,导致升级出现问题,请执行以下命令删除composer代理,然后再升级
composer config -g --unset repos.packagist