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']
// 以下も同様
$request->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