1.6 升級指南
升級前請做好備份,執行以下命令升級
composer config -g --unset repos.packagist
composer require -W workerman/webman-framework ^v1.6.11
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