대부분의 경우 하위 호환성이 유지되었지만, v2에서 v3로 이전할 때 알아야 할 몇 가지 변경 사항이 있습니다.
출력 버퍼링은 PHP 스크립트에서 생성된 출력물이 클라이언트로 전송되기 전에 PHP 내부 버퍼에 저장되는 프로세스입니다. 이를 통해 클라이언트로 전송되기 전에 출력물을 수정할 수 있습니다.
MVC 애플리케이션에서 컨트롤러는 "매니저"이며 뷰의 동작을 관리합니다. 컨트롤러 외부에서 출력물이 생성되는 것(또는 Flight의 경우 때로는 익명 함수 내에)는 MVC 패턴을 깨뜨립니다. 이 변경은 MVC 패턴에 더 일치하도록 하고 프레임워크를 더 예측 가능하고 사용하기 쉽도록 만드는 것입니다.
v2에서 출력 버퍼링은 자체 출력 버퍼를 일관되게 닫지 않는 방식으로 처리되었으며, 이는 단위 테스트와 스트리밍을 더 어렵게 만들었습니다. 대부분의 사용자에게는 이 변경이 실제로 영향을 미치지 않을 수 있습니다. 그러나 콜러블 및 컨트롤러 외부에서 콘텐츠를 에코하는 경우(예: 훅 내에서) 문제가 발생할 수 있습니다. 훅에서 콘텐츠를 에코하거나 프레임워크가 실제로 실행되기 전에 콘텐츠를 에코하는 것이 과거에는 작동했을 수 있지만 앞으로는 작동하지 않을 것입니다.
// index.php require 'vendor/autoload.php'; // 예시일 뿐 define('START_TIME', microtime(true)); function hello() { echo 'Hello World'; } Flight::map('hello', 'hello'); Flight::after('hello', function(){ // 실제로 이것은 문제가 없을 것입니다 echo '<p>This Hello World phrase was brought to you by the letter "H"</p>'; }); Flight::before('start', function(){ // 이러한 것들은 오류를 일으킬 것입니다 echo '<html><head><title>My Page</title></head><body>'; }); Flight::route('/', function(){ // 실제로 이것은 괜찮습니다 echo 'Hello World'; // 이것도 아주 괜찮을 것입니다 Flight::hello(); }); Flight::after('start', function(){ // 이것은 오류를 일으킬 것입니다 echo '<div>Your page loaded in '.(microtime(true) - START_TIME).' seconds</div></body></html>'; });
v3로 만들어진 코드를 다시 작성하지 않고 이전 방식을 계속 사용할 수 있을까요? 네, 가능합니다! flight.v2.output_buffering 구성 옵션을 true로 설정하여 v2 렌더링 동작을 활성화할 수 있습니다. 이를 통해 이전 렌더링 동작을 계속 사용할 수 있지만 앞으로 수정하는 것이 좋습니다. 프레임워크의 v4에서는 이것이 제거될 것입니다.
flight.v2.output_buffering
true
// index.php require 'vendor/autoload.php'; Flight::set('flight.v2.output_buffering', true); Flight::before('start', function(){ // 이제 이것은 아주 잘 작동할 것입니다 echo '<html><head><title>My Page</title></head><body>'; }); // 더 많은 코드
Dispatcher::invokeMethod(), Dispatcher::execute() 등과 같은 Dispatcher의 정적 메소드를 직접 호출했다면 코드를 업데이트하여 이러한 메소드를 직접 호출하지 않아야 합니다. Dispatcher는 보다 객체 지향적으로 변환되어 의존성 주입 컨테이너를 보다 쉽게 사용할 수 있도록 변경되었습니다. Dispatcher처럼 메소드를 호출해야 하는 경우에는 수동으로 $result = $class->$method(...$params); 또는 call_user_func_array()와 같은 것을 사용할 수 있습니다.
Dispatcher::invokeMethod()
Dispatcher::execute()
Dispatcher
$result = $class->$method(...$params);
call_user_func_array()
3.10.0 이전의 기본 동작은 헤더와 응답 본문을 모두 지우는 것이었습니다. 이것은 응답 본문만 지우도록 변경되었습니다. 헤더도 지우려면 Flight::response()->clear()를 사용할 수 있습니다.
Flight::response()->clear()