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\RendererKint\Renderer\AbstractRenderer

    • Renderer::SORT_FULLAbstractRenderer::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 클래스가 추가되었습니다. 애플리케이션 코드에서 모든 TimeTimeLegacy로 교체하십시오.

  • 단, 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
  • app/Config/DocTypes.php
    • 빈 HTML 요소(예: <input>)에서 슬래시(/) 문자를 제거할지 결정하는 속성 $html5가 추가되었으며, HTML5 호환을 위해 기본값이 true로 설정되었습니다.

  • app/Config/Encryption.php
  • 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

뷰 파일

다음 뷰 파일들이 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