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, header 데이터 덮어쓰기 지원

$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