4.4.8에서 4.5.0으로 업그레이드
설치 방법에 맞는 업그레이드 지침을 참조하십시오.
필수 파일 변경사항
index.php 및 spark
다음 파일들은 중요한 변경사항이 있으므로 업데이트된 버전을 반드시 애플리케이션에 병합해야 합니다:
public/index.phpspark
중요
위 파일들을 업데이트하지 않으면 composer update 실행 후 CodeIgniter가 제대로 동작하지 않습니다.
업그레이드 절차의 예는 다음과 같습니다:
composer update
cp vendor/codeigniter4/framework/public/index.php public/index.php
cp vendor/codeigniter4/framework/spark spark
주요 변경사항
소문자 HTTP 메서드 이름
Request::getMethod()
역사적인 이유로 Request::getMethod()는 기본적으로 소문자로 HTTP 메서드 이름을 반환했습니다.
그러나 메서드 토큰은 대소문자를 구분하는 메서드 이름을 가진 객체 기반 시스템의 게이트웨이로 사용될 수 있으므로 대소문자를 구분합니다. 관례상 표준화된 메서드는 모두 대문자 US-ASCII 문자로 정의됩니다. https://www.rfc-editor.org/rfc/rfc9110#name-overview 를 참조하십시오.
이제 Request::getMethod()의 사용 중단된 $upper 매개변수가 제거되었으며, getMethod()는 HTTP 메서드 이름을 있는 그대로 반환합니다. 즉, “GET”, “POST” 등과 같이 대문자로 반환됩니다.
소문자 HTTP 메서드 이름이 필요하면 PHP의 strtolower() 함수를 사용하십시오:
strtolower($request->getMethod())
애플리케이션 코드에서는 대문자 HTTP 메서드 이름을 사용해야 합니다.
app/Config/Filters.php
app/Config/Filters.php의 $methods에서 키를 대문자로 업데이트해야 합니다:
public array $methods = [
'POST' => ['invalidchars', 'csrf'],
'GET' => ['csrf'],
];
CURLRequest::request()
이전 버전에서는 request() 메서드에 소문자 HTTP 메서드를 전달할 수 있었습니다. 이 버그가 수정되었습니다.
이제 GET, POST 등 올바른 HTTP 메서드 이름을 전달해야 합니다. 그렇지 않으면 오류 응답을 받게 됩니다:
$client = \Config\Services::curlrequest();
$response = $client->request('get', 'https://www.google.com/', [
'http_errors' => false,
]);
$response->getStatusCode(); // In previous versions: 200
// In this version: 405
중첩된 라우트 그룹과 옵션
외부 group()에 전달된 옵션이 내부 group()의 옵션과 병합되지 않던 버그가 수정되었습니다.
적용된 옵션의 값이 변경될 수 있으므로 라우트 설정을 확인하고 수정하십시오.
예시:
$routes->group('admin', ['filter' => 'csrf'], static function ($routes) {
$routes->get('/', static function () {
// ...
});
$routes->group('users', ['namespace' => 'Users'], static function ($routes) {
$routes->get('/', static function () {
// ...
});
});
});
이제 csrf 필터는 admin과 admin/users 라우트 모두에 대해 실행됩니다. 이전 버전에서는 admin 라우트에만 실행되었습니다. 그룹 중첩도 참조하십시오.
필터 실행 순서
컨트롤러 필터의 실행 순서가 변경되었습니다. 이전 버전과 동일한 실행 순서를 유지하려면 Config\Feature::$oldFilterOrder를 true로 설정하십시오. 필터 실행 순서도 참조하십시오.
필터 그룹의 실행 순서가 변경되었습니다.
Before 필터:
Previous: route → globals → methods → filters Now: globals → methods → filters → route
After 필터:
Previous: route → globals → filters Now: route → filters → globals
2. The After Filters in Route filters and Filters filters execution order is now reversed.
다음 설정을 사용하는 경우:
// In app/Config/Routes.php $routes->get('/', 'Home::index', ['filter' => ['route1', 'route2']]); // In app/Config/Filters.php public array $filters = [ 'filter1' => ['before' => '*', 'after' => '*'], 'filter2' => ['before' => '*', 'after' => '*'], ];Before 필터:
Previous: route1 → route2 → filter1 → filter2 Now: filter1 → filter2 → route1 → route2After 필터:
Previous: route1 → route2 → filter1 → filter2 Now: route2 → route1 → filter2 → filter1
API\ResponseTrait과 문자열 데이터
이전 버전에서는 트레이트 메서드에 문자열 데이터를 전달하면 응답 형식이 JSON으로 결정되어도 프레임워크가 HTML 응답을 반환했습니다.
이제 문자열 데이터를 전달하면 JSON 응답을 올바르게 반환합니다. 응답 유형 처리도 참조하십시오.
컨트롤러에서 $stringAsHtml 속성을 true로 설정하면 이전 버전의 동작을 유지할 수 있습니다.
FileLocator::findQualifiedNameFromPath()
이전 버전에서 FileLocator::findQualifiedNameFromPath()는 선행 \가 있는 완전히 정규화된 클래스명을 반환했습니다. 이제 선행 \가 제거되었습니다.
선행 \를 기대하는 코드가 있다면 수정하십시오.
BaseModel::getIdValue()
BaseModel::getIdValue()가 abstract로 변경되었으며 구현이 제거되었습니다.
BaseModel을 확장하는 경우 자식 클래스에 getIdValue() 메서드를 구현하십시오.
Factories
팩토리(Factories)가 final 클래스로 변경되었습니다. 드물게 Factories를 상속한 경우 상속을 중단하고 코드를 자체 Factories 클래스에 복사하십시오.
자동 라우팅(레거시)
이전 버전에서는 해당 컨트롤러를 찾지 못해도 컨트롤러 필터가 실행될 수 있었습니다.
이 버그가 수정되어 이제 컨트롤러를 찾지 못하면 PageNotFoundException이 발생하고 필터는 실행되지 않습니다.
이 버그에 의존하는 코드가 있는 경우, 예를 들어 존재하지 않는 페이지에도 전역 필터가 실행되기를 기대한다면 새로운 필수 필터를 사용하십시오.
메서드 시그니처 변경사항
일부 메서드 시그니처가 변경되었습니다. 이를 확장하는 클래스는 변경사항을 반영하여 API를 업데이트해야 합니다. 자세한 내용은 변경 로그를 참조하십시오.
사용 중단 항목 제거
일부 사용 중단된 항목이 제거되었습니다. 이 항목들을 아직 사용하거나 해당 클래스를 확장하는 경우 코드를 업그레이드하십시오. 자세한 내용은 변경 로그를 참조하십시오.
주요 변경을 수반하는 개선사항
404 오버라이드 상태 코드
이전 버전에서 404 오버라이드는 기본적으로 상태 코드 200으로 응답을 반환했습니다. 이제 기본적으로 404를 반환합니다.
200을 원하면 컨트롤러에서 설정해야 합니다:
$routes->set404Override(static function () {
response()->setStatusCode(200);
echo view('my_errors/not_found.html');
});
Validation::run() 시그니처
Validation::run()와 ValidationInterface::run()의 메서드 시그니처가 변경되었습니다. $dbGroup 매개변수의 ?string 타입힌트가 제거되었습니다. LSP를 위반하지 않으려면 확장 클래스도 동일하게 매개변수를 제거해야 합니다.
프로젝트 파일
프로젝트 공간 (root, app, public, writable)의 일부 파일이 업데이트되었습니다. 이 파일들은 system 범위 밖에 있으므로 직접 변경하지 않으면 수정되지 않습니다.
프로젝트 공간의 변경사항 병합을 도와주는 서드파티 CodeIgniter 모듈이 있습니다: Packagist에서 찾기.
콘텐츠 변경사항
다음 파일들은 중요한 변경사항(사용 중단 또는 시각적 조정 포함)이 있으므로 업데이트된 버전을 애플리케이션에 병합하는 것을 권장합니다:
설정
app/Config/Filters.php
필수 필터가 추가되어 다음과 같은 변경이 이루어졌습니다. 변경 로그도 참조하십시오.
기본 클래스가 변경되었습니다:
class Filters extends \CodeIgniter\Config\Filters
$aliases 속성에 다음 항목이 추가되었습니다:
public array $aliases = [
// ...
'forcehttps' => \CodeIgniter\Filters\ForceHTTPS::class,
'pagecache' => \CodeIgniter\Filters\PageCache::class,
'performance' => \CodeIgniter\Filters\PerformanceMetrics::class,
];
새로운 속성 $required가 추가되어 다음과 같이 설정되었습니다:
public array $required = [
'before' => [
'forcehttps', // Force Global Secure Requests
'pagecache', // Web Page Caching
],
'after' => [
'pagecache', // Web Page Caching
'performance', // Performance Metrics
'toolbar', // Debug Toolbar
],
];
$global['after']의 'toolbar'가 제거되었습니다.
기타
- app/Config/Boot/production.php
error_reporting()의 기본 오류 레벨이E_ALL & ~E_DEPRECATED로 변경되었습니다.
- app/Config/Cors.php
CORS 설정을 처리하기 위해 추가되었습니다.
- app/Config/Database.php
$default의charset기본값이utf8mb4로 변경되었습니다.$default의DBCollat기본값이utf8mb4_general_ci로 변경되었습니다.$tests의DBCollat기본값이''로 변경되었습니다.
- app/Config/Feature.php
Config\Feature::$oldFilterOrder가 추가되었습니다. 필터 실행 순서를 참조하십시오.Config\Feature::$limitZeroAsAll가 추가되었습니다. limit(0) 동작를 참조하십시오.이제 다중 필터가 항상 활성화되므로
Config\Feature::$multipleFilters가 제거되었습니다.
- app/Config/Kint.php
Config Caching을 활성화하면 오류가 발생할 수 있으므로 더 이상
BaseConfig를 확장하지 않습니다.
- app/Config/Optimize.php
최적화 설정을 처리하기 위해 추가되었습니다.
- app/Config/Security.php
production환경에서$redirect속성이true로 변경되었습니다.
모든 변경사항
다음은 프로젝트 공간에서 변경된 모든 파일 목록입니다. 많은 파일들이 런타임에 영향을 미치지 않는 단순한 주석이나 형식 변경입니다:
app/Config/Autoload.php
app/Config/Boot/production.php
app/Config/Cache.php
app/Config/Cors.php
app/Config/Database.php
app/Config/Feature.php
app/Config/Filters.php
app/Config/Generators.php
app/Config/Kint.php
app/Config/Optimize.php
app/Config/Routing.php
app/Config/Security.php
app/Config/Session.php
app/Views/errors/cli/error_exception.php
app/Views/errors/html/error_exception.php
app/Views/welcome_message.php
composer.json
env
phpunit.xml.dist
preload.php
public/index.php
spark