3.x에서 4.x로 업그레이드

CodeIgniter 4는 프레임워크의 완전한 재작성이며 하위 호환성이 없습니다. 업그레이드보다는 앱을 변환하는 것으로 이해하는 것이 더 적절합니다. 변환이 완료되면 CodeIgniter 4의 한 버전에서 다음 버전으로 업그레이드하는 것은 간단합니다.

“군살 없고, 강력하며, 단순하다”는 철학은 유지되었지만, 구현 방식은 CodeIgniter 3에 비해 많이 달라졌습니다.

업그레이드를 위한 12단계 체크리스트는 없습니다. 대신 새 프로젝트 폴더에 CodeIgniter 4를 원하는 설치 방법으로 설치한 후, 앱 컴포넌트를 변환하고 통합하세요. 여기서는 가장 중요한 고려 사항들을 안내하겠습니다.

프로젝트를 업그레이드하려면 두 가지 주요 작업을 수행해야 합니다. 첫째, 모든 프로젝트에 중요한 일반적인 조정 사항이 있으며 반드시 처리해야 합니다. 둘째, CodeIgniter가 구축된 라이브러리들이 있으며 중요한 기능들을 포함하고 있습니다. 이 라이브러리들은 서로 독립적으로 운영되므로 하나씩 검토해야 합니다.

프로젝트 변환을 시작하기 전에 반드시 사용자 가이드를 읽으세요!

일반 조정 사항

다운로드

네임스페이스

  • CI4는 PHP 8.1 이상을 위해 만들어졌으며, 헬퍼 파일과 lang 파일을 제외한 프레임워크의 모든 것이 네임스페이스를 사용합니다.

애플리케이션 구조

중요

index.php는 더 이상 프로젝트 루트에 없습니다! 보안 강화와 컴포넌트 분리를 위해 public 폴더 안으로 이동되었습니다.

이는 웹 서버가 프로젝트 루트가 아닌 프로젝트의 public 폴더를 “가리키도록” 설정해야 함을 의미합니다.

공유 호스팅을 사용하는 경우 공유 호스팅 서비스에 배포를 참조하세요.

  • application 폴더는 app으로 이름이 변경되었으며, 프레임워크에는 이전과 동일한 의미의 system 폴더가 여전히 존재합니다.

  • 프레임워크는 이제 앱의 문서 루트로 사용되는 public 폴더를 제공합니다.

  • defined('BASEPATH') OR exit('No direct script access allowed'); 줄은 표준 설정에서 public 폴더 외부의 파일에 접근할 수 없으므로 필요하지 않습니다. 또한 CI4는 더 이상 BASEPATH 상수를 정의하지 않으므로 모든 파일에서 해당 줄을 제거하세요.

  • 캐시 데이터, 로그, 세션 데이터를 저장하기 위한 writable 폴더도 있습니다.

  • app 폴더는 CI3의 application 폴더와 매우 유사하지만, 일부 이름이 변경되고 일부 하위 폴더가 writable 폴더로 이동되었습니다.

  • 프레임워크 컴포넌트를 확장하는 다른 메커니즘이 있으므로 더 이상 중첩된 application/core 폴더가 없습니다(아래 참조).

라우팅

  • 자동 라우팅은 기본적으로 비활성화되어 있습니다. 기본적으로 모든 라우트를 정의해야 합니다.

  • CI3와 동일한 방식으로 자동 라우팅을 사용하려면 Auto Routing (Legacy)를 활성화해야 합니다.

  • CI4에는 선택적으로 사용할 수 있는 더 안전한 새로운 자동 라우팅(향상)도 있습니다.

모델, 뷰, 컨트롤러

  • CodeIgniter는 MVC 개념을 기반으로 합니다. 따라서 모델, 뷰, 컨트롤러의 변경 사항은 처리해야 할 가장 중요한 사항 중 하나입니다.

  • CodeIgniter 4에서 모델은 app/Models에 위치하며, PHP 시작 태그 바로 뒤에 namespace App\Models;use CodeIgniter\Model; 줄을 추가해야 합니다. 마지막으로 extends CI_Modelextends Model로 교체하세요.

  • CodeIgniter 4의 뷰는 app/Views로 이동되었습니다. 또한 뷰 로드 문법을 $this->load->view('directory_name/file_name')에서 echo view('directory_name/file_name');로 변경해야 합니다.

  • CodeIgniter 4의 컨트롤러는 app/Controllers로 이동해야 합니다. 그런 다음 PHP 시작 태그 뒤에 namespace App\Controllers;를 추가하세요. 마지막으로 extends CI_Controllerextends BaseController로 교체하세요.

  • 자세한 내용은 CodeIgniter4에서 MVC 클래스를 변환하는 단계별 지침을 제공하는 다음 업그레이드 가이드를 참조하세요:

핵심 클래스 변경 사항

  • Input
    • CI3의 Input은 CI4의 IncomingRequest에 해당합니다.

    • 역사적인 이유로 CI3와 CI4는 “get”, “post”와 같이 잘못된 HTTP 메서드 이름을 사용했습니다. v4.5.0부터 CI4는 “GET”, “POST”와 같이 올바른 HTTP 메서드 이름을 사용합니다.

  • Output

클래스 로딩

  • 더 이상 프레임워크 컴포넌트 참조가 컨트롤러의 속성으로 자동 주입되는 CodeIgniter “슈퍼 오브젝트”가 없습니다.

  • 클래스는 필요한 곳에서 인스턴스화되며, 프레임워크 컴포넌트는 서비스(Services)에서 관리합니다.

  • 오토로더는 Composer 오토로딩 지원과 함께 App (app 폴더) 및 CodeIgniter (system 폴더) 최상위 네임스페이스 내에서 PSR-4 스타일의 클래스 찾기를 자동으로 처리합니다.

  • “HMVC” 스타일을 포함하여 가장 익숙한 애플리케이션 구조를 지원하도록 클래스 로딩을 설정할 수 있습니다.

  • CI4는 CI3의 $this->load와 같이 클래스를 로드하고 인스턴스를 공유할 수 있는 팩토리(Factories)를 제공합니다.

라이브러리

  • 앱 클래스는 여전히 app/Libraries 안에 배치할 수 있지만, 반드시 그럴 필요는 없습니다.

  • CI3의 $this->load->library('x'); 대신 네임스페이스 규칙에 따라 $this->x = new \App\Libraries\X();를 사용할 수 있습니다. 또는 팩토리(Factories)를 사용할 수 있습니다: $this->x = \CodeIgniter\Config\Factories::libraries('X');.

헬퍼

  • 헬퍼는 이전과 거의 동일하지만 일부가 단순화되었습니다.

  • v4.3.0부터 CI3와 마찬가지로 app/Config/Autoload.php를 통해 헬퍼를 자동 로드할 수 있습니다.

  • CodeIgniter 3의 일부 헬퍼는 버전 4에 더 이상 존재하지 않습니다. 해당 헬퍼들에 대해서는 기능을 구현하는 새로운 방법을 찾아야 합니다. 해당 헬퍼들은 CAPTCHA Helper, Email Helper, Path Helper, Smiley Helper입니다.

  • CI3의 Download Helper가 제거되었습니다. force_download()를 사용하는 곳에서 Response 객체를 사용해야 합니다. 강제 파일 다운로드를 참조하세요.

  • CI3의 Language Helper가 제거되었습니다. 하지만 lang()은 CI4에서 항상 사용 가능합니다. lang()을 참조하세요.

  • CI3의 Typography Helper는 CI4에서 Typography 라이브러리가 됩니다.

  • CI3의 Directory HelperFile Helper는 CI4에서 파일시스템 헬퍼가 됩니다.

  • CI3의 String Helper 함수들은 CI4의 텍스트(Text) 헬퍼에 포함되어 있습니다.

  • CI4에서 redirect()는 CI3와 완전히 달라졌습니다.
    • redirect() 문서 CodeIgniter 3.x

    • redirect() 문서 CodeIgniter 4.x

    • CI4에서 redirect()는 리다이렉트하고 스크립트 실행을 종료하는 대신 RedirectResponse 인스턴스를 반환합니다. 컨트롤러 또는 컨트롤러 필터에서 이를 반환해야 합니다.

    • redirect()를 호출하기 전에 설정한 쿠키와 헤더는 RedirectResponse에 자동으로 전달되지 않습니다. 이를 전송하려면 withCookies() 또는 withHeaders()를 수동으로 호출해야 합니다.

    • CI3의 redirect('login/form')return redirect()->to('login/form')으로 변경해야 합니다.

  • 이벤트로 대체되었습니다.

  • CI3의 $hook['post_controller_constructor'] 대신 이제 네임스페이스 CodeIgniter\Events\Events;와 함께 Events::on('post_controller_constructor', ['MyClass', 'MyFunction']);를 사용합니다.

  • 이벤트는 항상 활성화되어 있으며 전역적으로 사용 가능합니다.

  • 훅 포인트 pre_controllerpost_controller가 제거되었습니다. 대신 컨트롤러 필터를 사용하세요.

  • 기본 메서드가 제거되었으므로 훅 포인트 display_overridecache_override가 제거되었습니다.

  • 훅 포인트 post_system은 최종 렌더링된 페이지를 전송하기 직전으로 이동되었습니다.

오류 처리

  • CI4에서 동작 방식이 약간 변경되었습니다.

    • CI3에서 동작 방식은 index.php 파일에서 설정됩니다:

      • error_reporting()로 설정된 오류 레벨의 오류는 기록됩니다(단, log_threshold 설정에 따라 로그 파일에 기록되지 않을 수 있습니다).

      • E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR 오류 레벨의 오류는 error_reporting()에 설정된 오류 레벨에 관계없이 프레임워크 처리를 중단시킵니다.

    • CI4에서 동작 방식은 app/Config/Boot/{environment}.php 파일에서 설정됩니다:

      • error_reporting()로 설정된 오류 레벨의 오류는 기록됩니다(단, Config\Logger::$threshold 설정에 따라 로그 파일에 기록되지 않을 수 있습니다).

      • error_reporting()에 의해 무시되지 않는 모든 오류는 프레임워크 처리를 중단시킵니다.

프레임워크 확장

  • MY_... 프레임워크 컴포넌트 확장 또는 교체를 위한 core 폴더가 필요하지 않습니다.

  • CI4 컴포넌트를 확장하거나 교체하기 위해 라이브러리 폴더에 MY_X 클래스가 필요하지 않습니다.

  • 원하는 위치에 해당 클래스를 만들고, 기본 컴포넌트 대신 직접 만든 컴포넌트를 로드하도록 app/Config/Services.php에 적절한 서비스 메서드를 추가하세요.

  • 자세한 내용은 코어 시스템 클래스 만들기를 참조하세요.

라이브러리 업그레이드

  • 앱 클래스는 여전히 app/Libraries 안에 배치할 수 있지만, 반드시 그럴 필요는 없습니다.

  • CI3의 $this->load->library('x'); 대신 네임스페이스 규칙에 따라 $this->x = new \App\Libraries\X();를 사용할 수 있습니다. 또는 팩토리(Factories)를 사용할 수 있습니다: $this->x = \CodeIgniter\Config\Factories::libraries('X');.

  • CodeIgniter 3의 일부 라이브러리는 버전 4에 더 이상 존재하지 않습니다. 해당 라이브러리들에 대해서는 기능을 구현하는 새로운 방법을 찾아야 합니다. 해당 라이브러리들은 Calendaring, FTP, Javascript, Shopping Cart, Trackback, XML-RPC /-Server, Zip Encoding입니다.

  • 두 CodeIgniter 버전 모두에 존재하는 다른 모든 라이브러리는 일부 조정을 통해 업그레이드할 수 있습니다. 가장 중요하고 많이 사용되는 라이브러리에는 코드를 조정하는 데 도움이 되는 간단한 단계와 예제가 포함된 업그레이드 가이드가 제공됩니다.