4.2.12에서 4.3.0으로 업그레이드
설치 방법에 해당하는 업그레이드 지침을 참조하십시오.
Composer 버전
중요
Composer를 사용하는 경우, CodeIgniter v4.3.0은 Composer 2.0.14 이상이 필요합니다.
이전 버전의 Composer를 사용하고 있다면 composer 도구를 업그레이드하고, vendor/ 디렉토리를 삭제한 후 composer update를 다시 실행하십시오.
절차는 예를 들어 다음과 같습니다:
composer self-update
rm -rf vendor/
composer update
필수 파일 변경사항
spark
다음 파일들은 중요한 변경사항이 있으므로 업데이트된 버전을 반드시 병합해야 합니다:
spark
중요
이 파일을 업데이트하지 않으면 composer update를 실행한 후 Spark 명령어가 전혀 작동하지 않습니다.
업그레이드 절차는 예를 들어 다음과 같습니다:
composer update
cp vendor/codeigniter4/framework/spark .
설정 파일
app/Config/Kint.php
app/Config/Kint.php가 Kint 5.0에 맞게 업데이트되었습니다.
다음을 교체해야 합니다:
Kint\Renderer\Renderer를Kint\Renderer\AbstractRenderer로Renderer::SORT_FULL을AbstractRenderer::SORT_FULL로
app/Config/Exceptions.php
PHP 8.2를 사용하는 경우, 새 속성
$logDeprecations와$deprecationLogLevel을 추가해야 합니다.
Mock 설정 클래스
테스트에서 다음 Mock 설정 클래스를 사용하는 경우, app/Config의 해당 설정 파일을 업데이트해야 합니다:
MockAppConfig(Config\App)MockCLIConfig(Config\App)MockSecurityConfig(Config\Security)
이 설정 클래스의 속성에 타입을 추가하십시오. 속성 타입에 맞게 속성 값을 수정해야 할 수도 있습니다.
composer.json
CodeIgniter를 수동으로 설치하고 Composer를 사용 중이라면, 다음 줄을 제거하고 composer update를 실행해야 합니다.
{
...
"require": {
...
"kint-php/kint": "^4.2", <-- Remove this line
...
},
...
"scripts": {
"post-update-cmd": [
"CodeIgniter\\ComposerScripts::postUpdate" <-- Remove this line
],
"test": "phpunit"
},
...
}
주요 변경사항
데이터베이스 예외 변경사항
데이터베이스 오류 발생 시 예외 클래스가 변경될 수 있습니다. 예외를 catch하는 경우, 코드가 해당 예외를 올바르게 catch할 수 있는지 확인해야 합니다.
이제
CI_DEBUG가 false인 경우에도 일부 예외가 발생합니다.트랜잭션 중에는
DBDebug가 true라도 기본적으로 예외가 발생하지 않습니다. 예외가 발생하도록 하려면transException(true)를 호출해야 합니다. 예외 던지기를 참조하십시오.자세한 내용은 데이터베이스 오류 발생 시 예외를 참조하십시오.
잡히지 않은 예외의 HTTP 상태 코드 및 종료 코드
예외 코드를 HTTP 상태 코드로 사용하는 경우 HTTP 상태 코드가 변경됩니다. 이 경우 예외에
HTTPExceptionInterface를 구현해야 합니다. 예외에 HTTP 상태 코드 지정를 참조하십시오.예외 코드를 기반으로 종료 코드를 사용하는 경우 종료 코드가 변경됩니다. 이 경우 예외에
HasExitCodeInterface를 구현해야 합니다. 예외에 종료 코드 지정를 참조하십시오.
redirect()->withInput()과 유효성 검사 오류
redirect()->withInput()과 유효성 검사 오류에는 문서화되지 않은 동작이 있었습니다. withInput()으로 리디렉션하면 CodeIgniter는 유효성 검사 오류를 세션에 저장하며, 새 유효성 검사가 실행되기 전에 리디렉션된 페이지에서 유효성 검사 객체로 오류를 가져올 수 있었습니다:
// In the controller
if (! $this->validate($rules)) {
return redirect()->back()->withInput();
}
// In the view of the redirected page
<?= service('Validation')->listErrors() ?>
이 동작은 버그였으며 v4.3.0에서 수정되었습니다.
이 버그에 의존하는 코드가 있다면 변경해야 합니다. 유효성 검사 객체 대신 새로운 Form 헬퍼인 validation_errors(), validation_list_errors(), validation_show_error()를 사용하여 유효성 검사 오류를 표시하십시오.
유효성 검사 변경사항
ValidationInterface가 변경되었습니다. 구현 클래스도 LSP를 위반하지 않도록 메서드와 파라미터를 추가해야 합니다. 자세한 내용은 유효성 검사 변경를 참조하십시오.Validation::loadRuleGroup()의 반환값이$group이 비어 있을 때null에서[]로 변경되었습니다. 이 동작에 의존하는 경우 코드를 업데이트하십시오.
Time 수정사항
버그 수정으로 인해 Time의 일부 메서드가 가변(mutable) 동작에서 불변(immutable) 동작으로 변경되었습니다.
Time은 이제DateTimeImmutable을 상속합니다. 자세한 내용은 ChangeLog를 참조하십시오.수정 이전의
Time동작이 필요하다면, 호환 가능한TimeLegacy클래스가 추가되었습니다. 애플리케이션 코드에서 모든Time을TimeLegacy로 교체하십시오.단,
TimeLegacy는 사용 중단(deprecated)되었으므로 코드를 업데이트할 것을 권장합니다.
예:
// Before
$time = Time::now();
// ...
if ($time instanceof DateTime) {
// ...
}
// After
$time = Time::now();
// ...
if ($time instanceof DateTimeInterface) {
// ...
}
// Before
$time1 = new Time('2022-10-31 12:00');
$time2 = $time1->modify('+1 day');
echo $time1; // 2022-11-01 12:00:00
echo $time2; // 2022-11-01 12:00:00
// After
$time1 = new Time('2022-10-31 12:00');
$time2 = $time1->modify('+1 day');
echo $time1; // 2022-10-31 12:00:00
echo $time2; // 2022-11-01 12:00:00
테스트에서 STDERR 및 STDOUT 스트림 캡처
오류 및 출력 스트림을 캡처하는 방식이 변경되었습니다. 이제 다음 대신:
use CodeIgniter\Test\Filters\CITestStreamFilter;
protected function setUp(): void
{
CITestStreamFilter::$buffer = '';
$this->streamFilter = stream_filter_append(STDOUT, 'CITestStreamFilter');
$this->streamFilter = stream_filter_append(STDERR, 'CITestStreamFilter');
}
protected function tearDown(): void
{
stream_filter_remove($this->streamFilter);
}
다음을 사용해야 합니다:
use CodeIgniter\Test\Filters\CITestStreamFilter;
protected function setUp(): void
{
CITestStreamFilter::registration();
CITestStreamFilter::addOutputFilter();
CITestStreamFilter::addErrorFilter();
}
protected function tearDown(): void
{
CITestStreamFilter::removeOutputFilter();
CITestStreamFilter::removeErrorFilter();
}
또는 트레이트 CodeIgniter\Test\StreamFilterTrait를 사용하십시오. CLI 출력 테스트를 참조하십시오.
인터페이스 변경사항
일부 인터페이스가 수정되었습니다. 자세한 내용은 인터페이스 변경를 참조하십시오.
외래 키 데이터
BaseConnection::getForeignKeyData()가 반환하는 데이터 구조가 변경되었습니다. 이 메서드에 의존하는 코드는 새로운 구조를 사용하도록 조정해야 합니다.
예: tableprefix_table_column1_column2_foreign
반환되는 데이터의 구조는 다음과 같습니다:
/**
* @return array[
* {constraint_name} =>
* stdClass[
* 'constraint_name' => string,
* 'table_name' => string,
* 'column_name' => string[],
* 'foreign_table_name' => string,
* 'foreign_column_name' => string[],
* 'on_delete' => string,
* 'on_update' => string,
* 'match' => string
* ]
* ]
*/
주요 개선사항
다중 도메인 지원
Config\App::$allowedHostnames를 설정하면, 현재 URL이 일치하는 경우base_url(),current_url(),site_url()등의 URL 관련 함수가Config\App::$allowedHostnames에 설정된 호스트명으로 URL을 반환합니다.
데이터베이스
CodeIgniter\Database\Database::loadForge()의 반환 타입이Forge로 변경되었습니다. 하위 클래스도 마찬가지로 타입을 변경해야 합니다.CodeIgniter\Database\Database::loadUtils()의 반환 타입이BaseUtils로 변경되었습니다. 하위 클래스도 마찬가지로 타입을 변경해야 합니다.BaseBuilder::updateBatch()의 두 번째 파라미터$index가$constraints로 변경되었습니다. 이제 배열, 문자열, 또는RawSql타입을 허용합니다. 하위 클래스도 마찬가지로 타입을 변경해야 합니다.BaseBuilder::insertBatch()와BaseBuilder::updateBatch()의$set파라미터가 이제 단일 행 데이터 객체를 허용합니다. 하위 클래스도 마찬가지로 타입을 변경해야 합니다.BaseBuilder::_updateBatch()의 세 번째 파라미터$index가$values로 변경되었으며, 파라미터 타입이array로 변경되었습니다. 하위 클래스도 마찬가지로 타입을 변경해야 합니다.Model::update()메서드는 이제 WHERE 절 없이 SQL 문이 생성되면DatabaseException을 발생시킵니다. 테이블의 모든 레코드를 업데이트해야 한다면 Query Builder를 대신 사용하십시오. 예:$model->builder()->update($data).
Honeypot과 CSP
CSP가 활성화되면 Honeypot 필드를 숨기기 위해 컨테이너 태그에 id 속성 id="hpc"가 삽입됩니다. 뷰에서 이미 해당 id를 사용하고 있다면 Config\Honeypot::$containerId로 변경해야 합니다. 또한 Config\Honeypot::$container에서 style="display:none"을 제거할 수 있습니다.
기타
헬퍼:
html_helper,form_helper또는 공통 함수의 빈 HTML 요소(예:<input>)가 기본적으로 HTML5 호환으로 변경되었습니다. XHTML 호환이 필요하다면 app/Config/DocTypes.php의$html5속성을false로 설정해야 합니다.CLI: Spark 명령어 실행이
CodeIgniter\CodeIgniter에서 분리되었으므로,Services::codeigniter()서비스가 재정의된 경우 명령어 실행 시 문제가 발생할 수 있습니다.
프로젝트 파일
프로젝트 공간 (root, app, public, writable)의 많은 파일이 업데이트되었습니다. 이 파일들은 system 범위 밖에 있으므로 직접 개입하지 않으면 변경되지 않습니다. 프로젝트 공간의 변경사항 병합을 돕는 서드파티 CodeIgniter 모듈이 있습니다: Packagist에서 탐색.
콘텐츠 변경사항
다음 파일들은 중요한 변경사항(사용 중단 또는 시각적 조정 포함)이 있으며, 업데이트된 버전을 애플리케이션에 병합할 것을 권장합니다:
설정
- app/Config/App.php
$baseURL의 호스트명 이외에 사이트 URL에서 허용할 호스트명을 설정하기 위한 새 속성$allowedHostnames가 추가되었습니다. 다중 도메인 지원를 참조하십시오.일광 절약 시간의 영향을 받지 않도록
$appTimezone속성이UTC로 변경되었습니다.
- app/Config/Autoload.php
헬퍼를 자동 로드하기 위한 새 속성
$helpers가 추가되었습니다.
- app/Config/Database.php
$default['DBDebug']와$test['DBDebug']가 기본값true로 변경되었습니다. 데이터베이스 오류 발생 시 예외를 참조하십시오.
- app/Config/DocTypes.php
빈 HTML 요소(예:
<input>)에서 슬래시(/) 문자를 제거할지 결정하는 속성$html5가 추가되었으며, HTML5 호환을 위해 기본값이true로 설정되었습니다.
- app/Config/Encryption.php
CI3 암호화 호환을 위해 새 속성
$rawData,$encryptKeyInfo,$authKeyInfo가 추가되었습니다. CI3과의 호환성을 유지하기 위한 설정를 참조하십시오.
- app/Config/Exceptions.php
두 개의 공개 속성
$logDeprecations와$deprecationLogLevel이 추가되었습니다. 자세한 내용은 지원 중단 경고 로깅를 참조하십시오.
- app/Config/Honeypot.php
CSP가 활성화될 때 컨테이너 태그의 id 속성 값을 설정하기 위한 새 속성
$containerId가 추가되었습니다.$template속성 값의input태그가 HTML5 호환으로 변경되었습니다.
- app/Config/Logger.php
production환경 이외에서$threshold속성이9로 변경되었습니다.
- app/Config/Modules.php
성능 향상을 위해 Composer 패키지 자동 검색을 제한하는 새 속성
$composerPackages가 추가되었습니다.
- app/Config/Routes.php
Spark 명령어 실행 방식이 변경되었으므로, 이제 프레임워크 내부 라우트 (
SYSTEMPATH . 'Config/Routes.php')를 더 이상 로드할 필요가 없습니다.
- app/Config/Security.php
CSRF 검사 실패 시 리디렉션을 방지하기 위해
$redirect속성의 값을false로 변경했습니다. 이는 CSRF 오류임을 더 쉽게 인식할 수 있도록 하기 위한 것입니다.
- app/Config/Session.php
세션 설정을 처리하기 위해 추가되었습니다.
- app/Config/Validation.php
보안 강화를 위해 기본 유효성 검사 규칙이 엄격한 규칙(Strict Rules)으로 변경되었습니다. 전통적 규칙과 엄격한 규칙를 참조하십시오.
뷰 파일
다음 뷰 파일들이 HTML5 호환 태그로 변경되었습니다. 또한 오류 메시지가 이제 Errors 언어 파일에 정의됩니다.
app/Views/errors/html/error_404.php
app/Views/errors/html/error_exception.php
app/Views/errors/html/production.php
app/Views/welcome_message.php
모든 변경사항
다음은 프로젝트 공간에서 변경된 모든 파일의 목록입니다. 대부분은 런타임에 영향을 미치지 않는 단순한 주석이나 형식 변경입니다. Config 클래스의 모든 원자 타입 속성에 타입이 지정되었습니다:
app/Config/App.php
app/Config/Autoload.php
app/Config/CURLRequest.php
app/Config/Cache.php
app/Config/ContentSecurityPolicy.php
app/Config/Cookie.php
app/Config/Database.php
app/Config/DocTypes.php
app/Config/Email.php
app/Config/Encryption.php
app/Config/Exceptions.php
app/Config/Feature.php
app/Config/Filters.php
app/Config/Format.php
app/Config/Generators.php
app/Config/Honeypot.php
app/Config/Images.php
app/Config/Kint.php
app/Config/Logger.php
app/Config/Migrations.php
app/Config/Mimes.php
app/Config/Modules.php
app/Config/Pager.php
app/Config/Paths.php
app/Config/Routes.php
app/Config/Security.php
app/Config/Session.php
app/Config/Toolbar.php
app/Config/UserAgents.php
app/Config/Validation.php
app/Views/errors/html/error_404.php
app/Views/errors/html/error_exception.php
app/Views/errors/html/production.php
app/Views/welcome_message.php
composer.json
env
phpunit.xml.dist
spark