버전 4.5.0
릴리스 날짜: 2024년 4월 7일
CodeIgniter4 4.5.0 릴리스
주요 사항
최소 PHP 요구 사항이 8.1로 업데이트되었습니다.
최소 PHPUnit 요구 사항이 10.5로 업데이트되었습니다.
CORS 필터 (기여: kenjis) 교차 출처 리소스 공유 (CORS)를 참고하세요.
프로덕션 환경에서 성능 향상을 위한 spark optimize 명령 (기여: kenjis). spark optimize를 참고하세요.
개선
필수 필터
새로운 필수 필터가 도입되었습니다. 이는 다른 종류의 필터 전후에 적용되는 특별한 필터로, 라우트가 존재하지 않아도 항상 적용됩니다.
다음 기존 기능들이 필수 필터로 재구현되었습니다.
Debug Toolbar에서 사용하는 벤치마크 타이머가 이제 필수 사전 필터와 필수 사후 필터 데이터를 수집합니다.
벤치마크 포인트가 변경되었습니다:
이전
bootstrap: Request 및 Response 객체 생성, 이벤트pre_system, RouteCollection 객체 인스턴스화, Routes 파일 로딩, Router 객체 인스턴스화,routing: 라우팅,
이후
bootstrap: Request 및 Response 객체 생성, 이벤트pre_system.required_before_filters: Filters 객체 인스턴스화, 필수 사전 필터 실행.routing: RouteCollection 객체 인스턴스화, Routes 파일 로딩, Router 객체 인스턴스화, 라우팅,
라우팅
AutoRouting Improved: CamelCase 컨트롤러 및 메서드 이름을 사용할 수 있도록 하는
$translateUriToCamelCase옵션이 추가되었습니다. URI를 CamelCase로 변환를 참고하세요.- 기타:
$multipleSegmentsOneParam옵션이 추가되었습니다. 이 옵션이 활성화되면(:any)와 같이 여러 세그먼트와 일치하는 플레이스홀더가 여러 세그먼트를 포함하더라도 하나의 매개변수로 직접 전달됩니다. 자세한 내용은 하나의 매개변수로서의 여러 URI 세그먼트를 참고하세요.이제
$override404에 설정한 404 컨트롤러의 메서드도 첫 번째 매개변수로PageNotFoundException메시지를 받습니다.이제
__invoke()메서드를 기본 메서드로 사용할 수 있습니다. 기본 메서드를 참고하세요.
명령
프로덕션 환경을 위한 설정을 최적화하는
spark optimize명령이 추가되었습니다. 자세한 내용은 spark optimize를 참고하세요.테스트 파일 스켈레톤을 생성하는
spark make:test명령이 추가되었습니다. 자세한 내용은 make:test를 참고하세요.Config 값을 확인하는
spark config:check명령이 추가되었습니다. 자세한 내용은 구성 값 확인를 참고하세요.중요한 PHP ini 설정을 확인하는
spark phpini:check명령이 추가되었습니다. 자세한 내용은 PHP ini 설정 확인를 참고하세요.번역 키를 업데이트하는
spark lang:find명령이 추가되었습니다. 자세한 내용은 명령을 통해 번역 파일 생성를 참고하세요.spark db:table명령에--dbgroup옵션이 추가되었습니다. Database Commands를 참고하세요.
테스팅
DomParser: 복잡한 표현식을 사용하여 DOMXPath 객체로 직접 작업할 수 있도록 하는 새로운 메서드
seeXPath()와dontSeeXPath()가 추가되었습니다.CLI: 새로운
InputOutput클래스가 추가되었으며, 이제MockInputOutput을 사용하면 명령에 대한 테스트를 더 쉽게 작성할 수 있습니다. MockInputOutput 사용를 참고하세요.Fabricator: Fabricator 클래스에 이제 각 필드의 값을 가짜로 만들기 전에 Faker의 수식자를 호출할 수 있도록
setUnique(),setOptional(),setValid()메서드가 추가되었습니다.TestResponse: TestResponse는 테스트가 아니므로 더 이상
PHPUnit\Framework\TestCase를 확장하지 않습니다. 어설션의 반환 타입이 이제 기본적으로void로 타입 지정됩니다.
데이터베이스
Query Builder
limit(0) 동작
limit(0)의 잘못된 동작을 수정하는 기능 플래그Feature::$limitZeroAsAll이 추가되었습니다.SQL 문에
LIMIT 0이 지정되면 0개의 레코드가 반환됩니다. 그러나 Query Builder에 버그가 있어,limit(0)이 지정되면 생성된 SQL 문에LIMIT절이 없어 모든 레코드가 반환됩니다.이 잘못된 동작이 미래 버전에서 수정될 예정이므로 app/Config/Feature.php의
$limitZeroAsAll을false로 설정하는 것이 권장됩니다. findAll(0) 동작도 참고하세요.
기타
점 (
.)이 포함된 데이터베이스 이름에 대한 지원이 추가되었습니다.
모델
모델 필드 캐스팅
데이터베이스에서 가져온 데이터를 적절한 PHP 타입으로 변환하는 기능이 추가되었습니다. 자세한 내용은 모델 필드 캐스팅을 참고하세요.
findAll(0) 동작
Query Builder의
limit(0)잘못된 동작을 수정하는 기능 플래그Feature::$limitZeroAsAll이 추가되었습니다. 자세한 내용은 limit(0) 동작를 참고하세요.이 플래그를 비활성화하면
findAll(0, $offset)과 같은 코드를findAll(null, $offset)으로 변경해야 합니다.
$updateOnlyChanged
Entity의 변경된 필드만 업데이트할지 여부를 지정하는 속성 $updateOnlyChanged가 추가되었습니다. 이 속성을 false로 설정하면, Entity를 업데이트할 때 Entity의 값이 변경되지 않았더라도 DataException “업데이트할 데이터가 없습니다”가 발생하지 않습니다.
See Using CodeIgniter’s Model for details.
날짜 저장
이제 Time 인스턴스를 저장할 때 날짜/시간 형식을 설정할 수 있습니다. 자세한 내용은 날짜 저장하기를 참고하세요.
라이브러리
CORS: 교차 출처 리소스 공유 (CORS) 필터와 클래스가 추가되었습니다.
- 유효성 검사:
유효성 검사할 데이터에 필드가 존재하는지 확인하는 새 규칙
field_exists가 추가되었습니다.Validation::run()의$dbGroup매개변수가 이제 데이터베이스 그룹 이름뿐만 아니라 데이터베이스 연결 인스턴스나 데이터베이스 설정 배열도 허용합니다.
- 세션:
RedisHandler가 이제 잠금 획득 간격 시간 ($lockRetryInterval)과 재시도 횟수 ($lockMaxRetries)를 설정할 수 있습니다.이제
RedisHandler와 함께 Redis ACL (사용자 이름 및 비밀번호)을 사용할 수 있습니다. 자세한 내용은 RedisHandler 드라이버를 참고하세요.
보안:
Config\Security::$redirect가 이제 기본적으로 환경별로 다릅니다. 프로덕션 환경에서는true로 변경되었지만 다른 환경에서는 여전히false입니다.
기타
부트스트랩: system/bootstrap.php를 대체하는
CodeIgniter\Boot클래스가 도입되었습니다.- 자동 로더:
Composer 사용 시 자동 로딩 성능이 개선되었습니다. composer.json의
autoload.psr4설정에App네임스페이스를 추가하면 앱 성능도 향상될 수 있습니다. 애플리케이션 네임스페이스를 참고하세요.FileLocator 캐싱이 구현되었습니다. 자세한 내용은 FileLocator 캐싱을 참고하세요.
FileLocatorInterface가 추가되었습니다.
CodeIgniter: CodeIgniter 3에서 지원되던 뷰 파일에서 메모리 사용량을 표시하는 의사 변수
{memory_usage}가 추가되었습니다.이벤트: Spark 명령을 위한 이벤트 포인트
pre_command와post_command가 추가되었습니다. Event Points를 참고하세요.HTTP: 동일한 이름의 헤더를 추가하는
Message::addHeader()메서드가 추가되었습니다.CodeIgniter\HTTP\Message::addHeader()를 참고하세요.웹 페이지 캐싱:
ResponseCache가 캐시 키에 요청 HTTP 메서드를 포함하도록 개선되었습니다. 이는 HTTP 메서드가 다르면 동일한 URI가 별도로 캐시됨을 의미합니다.CSP: 기존 CSP 지시문을 지우는
ContentSecurityPolicy::clearDirective()메서드가 추가되었습니다. 지시문 지우기를 참고하세요.
주요 변경사항
동작 변경
소문자 HTTP 메서드 이름
역사적 이유로 프레임워크는 “get”, “post”와 같이 소문자로 HTTP 메서드 이름을 사용했습니다. 그러나 메서드 토큰은 대소문자를 구분하는 메서드 이름을 가진 객체 기반 시스템의 게이트웨이로 사용될 수 있으므로 대소문자를 구분합니다. 관례상 표준화된 메서드는 모두 대문자 US-ASCII 문자로 정의됩니다. https://www.rfc-editor.org/rfc/rfc9110#name-overview를 참고하세요.
이제 프레임워크는 “GET”, “POST”와 같이 올바른 HTTP 메서드 이름을 사용합니다.
Request::getMethod()가 대문자 HTTP 메서드를 반환합니다.CURLRequest::request()는 허용된 HTTP 메서드를 대문자로 변경하지 않습니다.
자세한 내용은 소문자 HTTP 메서드 이름을 참고하세요.
필터 실행 순서
컨트롤러 필터가 실행되는 순서가 변경되었습니다. 자세한 내용은 업그레이드 가이드를 참고하세요.
중첩 라우트 그룹과 옵션
버그 수정으로 인해 외부 group()에 전달된 옵션이 내부 group()의 옵션과 병합되도록 동작이 변경되었습니다. 자세한 내용은 업그레이드 가이드를 참고하세요.
API\ResponseTrait
이제 응답 형식이 JSON일 때 문자열 데이터를 전달하면 프레임워크가 JSON 응답을 반환합니다. 이전 버전에서는 HTML 응답을 반환했습니다. 자세한 내용은 업그레이드 가이드를 참고하세요.
Factories 클래스
팩토리(Factories)가 final 클래스로 변경되었습니다. 정적 클래스이며, 확장하더라도 교체할 방법이 없습니다.
기타
AutoRouting Legacy: 요청 URI에 해당하는 컨트롤러가 존재하지 않으면
PageNotFoundException이 발생하도록 변경되었습니다.로거:
log_message()함수와CodeIgniter\Log\Logger의 로거 메서드가 이제bool값을 반환하지 않습니다. PSR-3 인터페이스를 따르기 위해 반환 타입이void로 수정되었습니다.자동 로더:
FileLocator::findQualifiedNameFromPath()가 반환하는 완전히 정규화된 클래스 이름에서 접두사\가 제거되었습니다.BaseModel:
getIdValue()메서드가abstract로 변경되었습니다.라우팅: 404 오버라이드 기능이 이제 기본적으로 Response 상태 코드를 404로 변경합니다. 업그레이드 가이드를 참고하세요.
system/bootstrap.php: 이 파일은 사용할 수 없습니다. 코드가 새로운
CodeIgniter\Boot클래스로 이동되었습니다.
인터페이스 변경
참고
관련 CodeIgniter 코어 클래스를 확장하거나 이 인터페이스들을 구현하지 않았다면, 이 모든 변경사항은 하위 호환되며 별도의 조치가 필요하지 않습니다.
ResponseInterface:
ResponseInterface::setCookie()의 세 번째 매개변수$expire의 기본값이''에서0으로 수정되었습니다.로거: psr/log 패키지가 v3.0.0으로 업그레이드되었습니다.
유효성 검사:
ValidationInterface::run()의 메서드 시그니처가 변경되었습니다.$dbGroup매개변수의?string타입힌트가 제거되었습니다.
메서드 시그니처 변경
FileLocatorInterface
라우터:
RouteCollection생성자의 첫 번째 매개변수가FileLocator에서FileLocatorInterface로 변경되었습니다.뷰:
View생성자의 세 번째 매개변수가FileLocator에서FileLocatorInterface로 변경되었습니다.
반환 타입 변경
모델:
Model과BaseModel클래스의objectToRawArray()메서드 반환 타입이?array에서array로 변경되었습니다.
전통적인 유효성 검사 규칙
프레임워크 코드베이스에 declare(strict_types=1)을 추가하기 위해, 모든 전통적인 유효성 검사 규칙 클래스 CodeIgniter\Validation\FormatRules와 CodeIgniter\Validation\Rules에서 유효성 검사할 값에 대한 메서드 매개변수 타입 ?string이 제거되었습니다.
예를 들어, 메서드 시그니처가 다음과 같이 변경되었습니다:
Before: public function integer(?string $str = null): bool
After: public function integer($str = null): bool
기타
로거: PSR-3 인터페이스를 구현하는
CodeIgniter\Log\Logger의 메서드 시그니처가 수정되었습니다.bool반환 타입이void로 변경되었습니다.$message매개변수에 이제string|Stringable타입이 지정됩니다.유효성 검사:
Validation::run()의 메서드 시그니처가 변경되었습니다.$dbGroup매개변수의?string타입힌트가 제거되었습니다.
사용 중단 항목 제거
요청
RequestInterface와Request의getMethod()에서$upper매개변수가 제거되었습니다. 소문자 HTTP 메서드 이름을 참고하세요.RequestInterface와Request에서 사용 중단된isValidIP()메서드가 제거되었습니다.IncomingRequest의 사용 중단된 속성$uri와$config의 가시성이 보호로 변경되었습니다.IncomingRequest의$enableCSRF속성이 제거되었습니다.IncomingRequest의removeRelativeDirectory()메서드가 제거되었습니다.Request의$proxyIPs속성이 제거되었습니다.
필터
이제 다중 필터가 항상 활성화되어 있으므로 다음 사용 중단 항목들이 제거되었습니다.
Filters::enableFilter()RouteCollection::getFilterForRoute()Router::$filterInfoRouter::getFilter()
데이터베이스
ModelFactory
모델
BaseModel::idValue()BaseModel::fillPlaceholders()Model::idValue()Model::classToArray()
응답
사용 중단된 속성
ResponseTrait::$CSP의 가시성이 보호로 변경되었습니다.다음 사용 중단된 속성들이 제거되었습니다.
ResponseTrait::$CSPEnabledResponseTrait::$cookiePrefixResponseTrait::$cookieDomainResponseTrait::$cookiePathResponseTrait::$cookieSecureResponseTrait::$cookieHTTPOnlyResponseTrait::$cookieSameSiteResponseTrait::$cookies
보안
SecurityInterface::isExpired()Security::isExpired()Security::CSRFVerify()Security::getCSRFHash()Security::getCSRFTokenName()Security::sendCookie()Security::doSendCookie()
CodeIgniter
$path$useSafeOutputuseSafeOutput()setPath()
테스트
CIDatabaseTestCaseControllerResponseControllerTesterFeatureResponseFeatureTestCaseMock\MockSecurityConfig
Spark 명령
migrate:createsession:migration
기타
캐시: 사용 중단된
CodeIgniter\Cache\Exceptions\ExceptionInterface가 제거되었습니다.- 설정:
사용 중단된
CodeIgniter\Config\Config클래스가 제거되었습니다.사용 중단된
CodeIgniter\Config\BaseService::discoverServices()메서드가 제거되었습니다.
컨트롤러: 사용 중단된
Controller::loadHelpers()메서드가 제거되었습니다.예외: 사용 중단된
CodeIgniter\Exceptions\CastException클래스가 제거되었습니다.Entity: 사용 중단된
CodeIgniter\Entity클래스가 제거되었습니다. 대신CodeIgniter\Entity\Entity를 사용하세요.spark: 사용 중단된 상수
SPARKED가 제거되었습니다.
메시지 변경
CLI.generator.className.test메시지가 추가되었습니다.Validation.field_exists오류 메시지가 추가되었습니다.
변경
부트스트랩: .env 로딩과
ENVIRONMENT정의가 bootstrap.php 로딩 전으로 이동되었습니다.- 설정:
이제 다중 필터가 항상 활성화되어 있으므로
Config\Feature::$multipleFilters가 제거되었습니다.프로덕션 환경의 기본 오류 수준 (app/Config/Boot/production.php)이 프로덕션용 기본 php.ini에 맞게
E_ALL & ~E_DEPRECATED로 변경되었습니다.
RouteCollection: 보호 속성
$routes의 HTTP 메서드 키가 소문자에서 대문자로 수정되었습니다.예외: 사용되지 않는
CodeIgniter\Exceptions\AlertError와CodeIgniter\Exceptions\EmergencyError가 제거되었습니다.Forge:
SQLSRVForge가 이제 테이블 컬럼을 추가할 때ENUM데이터 타입을VARCHAR(n)으로 변환합니다. 이전 버전에서는 SQL Server에서 사용 중단된TEXT로 변환했습니다.대부분의 프레임워크 코드베이스에
declare(strict_types=1)이 추가되었습니다.
사용 중단
서비스:
BaseService::$services속성이 사용 중단되었습니다. 더 이상 사용되지 않습니다.- CodeIgniter:
determinePath()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다.resolvePlatformExtensions()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다.CodeIgniter\Boot::checkMissingExtensions()메서드로 이동되었습니다.bootstrapEnvironment()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다.CodeIgniter\Boot::loadEnvironmentBootstrap()메서드로 이동되었습니다.initializeKint()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다.Autoloader로 이동되었습니다.autoloadKint()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다.Autoloader로 이동되었습니다.configureKint()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다.Autoloader로 이동되었습니다.
응답: 생성자 매개변수
$config가 사용 중단되었습니다. 더 이상 사용되지 않습니다.- 필터:
Filters가Config\Filters::$methods의 소문자 HTTP 메서드 키를 허용하는 기능이 사용 중단되었습니다. 대신 올바른 대문자 HTTP 메서드 키를 사용하세요.spark filter:check명령이 소문자 HTTP 메서드를 허용하는 기능이 사용 중단되었습니다. 대신 올바른 대문자 HTTP 메서드를 사용하세요.
RouteCollection:
match()와setHTTPVerb()메서드가 소문자 HTTP 메서드를 허용하는 기능이 사용 중단되었습니다. 대신 올바른 대문자 HTTP 메서드를 사용하세요.FeatureTestTrait:
call()와withRoutes()메서드가 소문자 HTTP 메서드를 허용하는 기능이 사용 중단되었습니다. 대신 올바른 대문자 HTTP 메서드를 사용하세요.데이터베이스:
BaseConnection::$strictOn이 사용 중단되었습니다. 향후MySQLi\Connection으로 이동될 예정입니다.
버그 수정
수정된 버그의 전체 목록은 저장소의 CHANGELOG.md를 참고하세요.