3.x에서 4.x로 업그레이드
CodeIgniter 4는 프레임워크의 완전한 재작성이며 하위 호환성이 없습니다. 업그레이드보다는 앱을 변환하는 것으로 이해하는 것이 더 적절합니다. 변환이 완료되면 CodeIgniter 4의 한 버전에서 다음 버전으로 업그레이드하는 것은 간단합니다.
“군살 없고, 강력하며, 단순하다”는 철학은 유지되었지만, 구현 방식은 CodeIgniter 3에 비해 많이 달라졌습니다.
업그레이드를 위한 12단계 체크리스트는 없습니다. 대신 새 프로젝트 폴더에 CodeIgniter 4를 원하는 설치 방법으로 설치한 후, 앱 컴포넌트를 변환하고 통합하세요. 여기서는 가장 중요한 고려 사항들을 안내하겠습니다.
프로젝트를 업그레이드하려면 두 가지 주요 작업을 수행해야 합니다. 첫째, 모든 프로젝트에 중요한 일반적인 조정 사항이 있으며 반드시 처리해야 합니다. 둘째, CodeIgniter가 구축된 라이브러리들이 있으며 중요한 기능들을 포함하고 있습니다. 이 라이브러리들은 서로 독립적으로 운영되므로 하나씩 검토해야 합니다.
프로젝트 변환을 시작하기 전에 반드시 사용자 가이드를 읽으세요!
일반 조정 사항
다운로드
CI4는 여전히 즉시 실행 가능한 zip 또는 tarball로 제공됩니다.
Composer를 사용하여 설치할 수도 있습니다.
네임스페이스
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_Model을extends 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_Controller를extends BaseController로 교체하세요.자세한 내용은 CodeIgniter4에서 MVC 클래스를 변환하는 단계별 지침을 제공하는 다음 업그레이드 가이드를 참조하세요:
핵심 클래스 변경 사항
- Input
CI3의 Input은 CI4의 IncomingRequest에 해당합니다.
역사적인 이유로 CI3와 CI4는 “get”, “post”와 같이 잘못된 HTTP 메서드 이름을 사용했습니다. v4.5.0부터 CI4는 “GET”, “POST”와 같이 올바른 HTTP 메서드 이름을 사용합니다.
클래스 로딩
더 이상 프레임워크 컴포넌트 참조가 컨트롤러의 속성으로 자동 주입되는 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 Helper와 File Helper는 CI4에서 파일시스템 헬퍼가 됩니다.
CI3의 String Helper 함수들은 CI4의 텍스트(Text) 헬퍼에 포함되어 있습니다.
- CI4에서
redirect()는 CI3와 완전히 달라졌습니다. CI4에서
redirect()는 리다이렉트하고 스크립트 실행을 종료하는 대신RedirectResponse인스턴스를 반환합니다. 컨트롤러 또는 컨트롤러 필터에서 이를 반환해야 합니다.redirect()를 호출하기 전에 설정한 쿠키와 헤더는RedirectResponse에 자동으로 전달되지 않습니다. 이를 전송하려면withCookies()또는withHeaders()를 수동으로 호출해야 합니다.CI3의
redirect('login/form')을return redirect()->to('login/form')으로 변경해야 합니다.
- CI4에서
훅
CI3의
$hook['post_controller_constructor']대신 이제 네임스페이스CodeIgniter\Events\Events;와 함께Events::on('post_controller_constructor', ['MyClass', 'MyFunction']);를 사용합니다.이벤트는 항상 활성화되어 있으며 전역적으로 사용 가능합니다.
훅 포인트
pre_controller와post_controller가 제거되었습니다. 대신 컨트롤러 필터를 사용하세요.기본 메서드가 제거되었으므로 훅 포인트
display_override와cache_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 버전 모두에 존재하는 다른 모든 라이브러리는 일부 조정을 통해 업그레이드할 수 있습니다. 가장 중요하고 많이 사용되는 라이브러리에는 코드를 조정하는 데 도움이 되는 간단한 단계와 예제가 포함된 업그레이드 가이드가 제공됩니다.