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