버전 4.6.0

릴리스 날짜: 2025년 1월 19일

CodeIgniter4 4.6.0 릴리스

주요 변경사항

동작 변경사항

예외

예외 클래스가 재설계되었습니다. 자세한 내용은 예외 디자인을 참조하세요. 이에 따라 다음과 같은 주요 변경사항이 적용되었습니다:

  • Validation::setRule()은 이제 TypeError 대신 CodeIgniter\Exceptions\InvalidArgumentException을 발생시킵니다.

  • CriticalError는 이제 Error 대신 CodeIgniter\Exceptions\RuntimeException을 상속합니다.

  • DatabaseException은 이제 Error 대신 CodeIgniter\Exceptions\RuntimeException을 상속합니다.

  • ConfigException은 이제 CodeIgniter\Exceptions\CriticalError 대신 CodeIgniter\Exceptions\RuntimeException을 상속합니다.

  • TestException은 이제 CodeIgniter\Exceptions\CriticalError 대신 CodeIgniter\Exceptions\LogicException을 상속합니다.

필터 변경사항

Filters 클래스가 변경되어 before 또는 after에서 동일한 필터를 다른 인자로 여러 번 실행할 수 있게 되었습니다. 자세한 내용은 업그레이드 가이드를 참조하세요.

레지스트라

레지스트라 자동 탐색이 두 번 실행되는 것을 방지하는 검사가 추가되었습니다. 두 번 실행되면 예외가 발생합니다. 비정상적인 방법을 사용하는 Registrar를 참조하세요.

Time::createFromTimestamp()

Time::createFromTimestamp()는 타임존 처리 방식이 변경되었습니다. $timezone을 명시적으로 전달하지 않으면, 이전에는 현재 설정된 기본 타임존이 사용되었지만 이제는 UTC로 설정됩니다. 자세한 내용은 업그레이드 가이드를 참조하세요.

마이크로초를 포함한 Time

Time의 일부 메서드에서 마이크로초가 손실되는 버그가 수정되었습니다. 자세한 내용은 업그레이드 가이드를 참조하세요.

Time::setTimestamp()

Time::setTimestamp()의 동작이 수정되었습니다. 자세한 내용은 업그레이드 가이드를 참조하세요.

비HTML 요청에 대한 오류 보고

이전 버전에서는 HTML을 허용하지 않는 요청이 들어올 때, CodeIgniter는 developmenttesting 환경에서만 오류 세부 정보를 표시했습니다.

하지만 사용자 정의 환경에서는 오류 세부 정보를 표시할 수 없었기 때문에, PHP ini 설정의 display_errors가 활성화된 경우 오류 세부 정보가 표시되도록 동작이 수정되었습니다.

이 수정으로 인해 HTML 요청과 비HTML 요청 모두 동일한 조건에서 오류 세부 정보가 표시됩니다.

세션 ID (SID)

이제 Session 라이브러리는 문자당 4비트의 엔트로피를 가진 PHP 기본 32자 SID 사용을 강제합니다. 자세한 내용은 업그레이드 가이드를 참조하세요.

헤더

Response 클래스로 설정한 헤더가 PHP header() 함수로 설정된 헤더를 대체합니다.

이전 버전에서는 Response 클래스로 설정한 헤더가 기존 헤더에 추가되어 변경할 방법이 없었습니다. 이로 인해 상호 배타적인 지시문으로 동일한 헤더가 설정된 경우 예기치 않은 동작이 발생할 수 있었습니다.

예를 들어, 세션은 header() 함수로 자동으로 헤더를 설정합니다:

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache

따라서 Expires 헤더를 한 번 더 설정하면 중복된 헤더가 생깁니다:

$response->removeHeader('Expires'); // has no effect
return $response->setHeader('Expires', 'Sun, 17 Nov 2024 14:17:37 GMT');

응답 헤더:

Expires: Thu, 19 Nov 1981 08:52:00 GMT
// ...
Expires: Sun, 17 Nov 2024 14:17:37 GMT

이 경우 브라우저가 어떤 헤더를 선택할지, 어느 것이 올바른 헤더인지 알 수 없습니다. 이번 버전 변경으로 기존 헤더가 덮어씌워집니다:

Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Expires: Sun, 17 Nov 2024 14:17:37 GMT

인터페이스 변경사항

참고

관련 CodeIgniter 핵심 클래스를 확장하거나 이 인터페이스를 구현하지 않은 경우, 이 모든 변경사항은 하위 호환성이 유지되므로 별도의 조치가 필요하지 않습니다.

  • Router: RouteCollectionInterface에 다음 메서드가 추가되었습니다:

    • getDefaultNamespace()

    • getRoutesOptions()

    • setHTTPVerb()

    • isFiltered()

    • getFiltersForRoute()

메서드 시그니처 변경사항

  • Router: DefinedRouteCollector의 생성자가 변경되었습니다. RouteCollection 타입힌트가 RouteCollectionInterface로 변경되었습니다.

  • View: renderSection() 메서드의 반환 타입이 string으로 변경되었으며, 이제 해당 메서드는 echo를 호출하지 않습니다.

  • Time: createFromTimestamp()의 첫 번째 매개변수 타입이 int에서 int|float로 변경되었으며, 반환 타입 static이 추가되었습니다.

  • Helpers: character_limiter()의 매개변수 이름이 업데이트되었습니다. 명명된 인자를 사용하는 경우 함수 호출을 업데이트해야 합니다.

제거된 타입 정의

  • Database:
    • BaseConnection::escapeIdentifier()의 첫 번째 매개변수의 string 타입이 제거되었습니다.

    • BaseConnection::getFieldNames()SQLite3\Connection::getFieldNames()의 첫 번째 매개변수의 string 타입이 제거되었습니다.

    • BaseConnection::_listColumns(), MySQLi\Connection::_listColumns(), OCI8\Connection::_listColumns(), Postgre\Connection::_listColumns(), SQLSRV\Connection::_listColumns(), SQLite3\Connection::_listColumns()의 첫 번째 매개변수의 string 타입이 제거되었습니다.

제거된 사용 중단 항목

  • API: CodeIgniter\API\ResponseTrait의 사용 중단된 failValidationError() 메서드가 제거되었습니다. 대신 failValidationErrors()를 사용하세요.

  • HTTP: CodeIgniter\HTTP\ResponseResponseInterface의 사용 중단된 getReason() 메서드가 제거되었습니다. 대신 getReasonPhrase()를 사용하세요.

  • Logger: 사용 중단된 CodeIgniter\Log\Logger::cleanFilenames()CodeIgniter\Test\TestLogger::cleanup()이 제거되었습니다. 대신 clean_path() 함수를 사용하세요.

  • Router: 사용 중단된 CodeIgniter\Router\Exceptions\RedirectException이 제거되었습니다. 대신 CodeIgniter\HTTP\Exceptions\RedirectException을 사용하세요.

  • Constants: 사용 중단된 EVENT_PRIORITY_* 상수가 제거되었습니다. 대신 클래스 상수 CodeIgniter\Events\Events::PRIORITY_LOW, CodeIgniter\Events\Events::PRIORITY_NORMAL, CodeIgniter\Events\Events::PRIORITY_HIGH를 사용하세요.

  • View: 사용 중단된 CodeIgniter\View\View::$currentSection 속성이 제거되었습니다.

  • Config: 사용 중단된 Config\Cache::$storePath 속성이 제거되었습니다. 대신 Config\Cache::$file['storePath']를 사용하세요.

  • Formatter: 사용 중단된 Config\Format::getFormatter()가 제거되었습니다. 대신 CodeIgniter\Format\Format::getFormatter()를 사용하세요.

  • Security: Config\Security::$samesite가 제거되었습니다. 대신 Config\Cookie::$samesite를 사용하세요.

  • Cookie: CodeIgniter\Cookie\CookieStoredispatch(), setRawCookie(), setCookie() 메서드가 제거되었습니다. 이 메서드들은 이제 CodeIgniter\HTTP\ResponseTrait의 일부입니다.

개선사항

Publisher

  • Publisher::discover()는 이제 두 번째 매개변수(namespace)를 허용하여 퍼블리셔를 검색할 네임스페이스를 지정할 수 있습니다. 자세한 내용은 특정 네임스페이스에서의 검색를 참조하세요.

예외

예외 클래스가 재설계되었습니다. 자세한 내용은 예외 디자인을 참조하세요. 이에 따라 다음과 같은 새로운 예외 클래스가 추가되었습니다:

  • CodeIgniter\Exceptions\LogicException

  • CodeIgniter\Exceptions\RuntimeException

  • CodeIgniter\Exceptions\BadFunctionCallException

  • CodeIgniter\Exceptions\BadMethodCallException

  • CodeIgniter\Exceptions\InvalidArgumentException

다음과 같은 새로운 예외 인터페이스가 추가되었습니다:

  • CodeIgniter\Files\Exceptions\ExceptionInterface

  • CodeIgniter\HTTP\Exceptions\ExceptionInterface

  • CodeIgniter\Router\Exceptions\ExceptionInterface

비HTML 응답에 대한 예외 표시는 이제 하드코딩된 환경 대신 PHP display_errors 설정에 의존합니다.

커맨드

  • spark routesspark filter:check 커맨드가 이제 필터 인자를 표시합니다.

  • spark filter:check 커맨드가 이제 필터 클래스 이름을 표시합니다.

  • 번역 파일을 동기화하는 spark lang:sync 커맨드가 추가되었습니다. 명령을 통한 동기화 번역 파일를 참조하세요.

  • spark phpini:check 커맨드에 선택적 opcache 인자가 추가되어 opcache 설정 정보를 표시할 수 있습니다.

라우팅

  • 이제 라우트 제한 시 여러 호스트명을 지정할 수 있습니다.

협상자

  • 엄격한 로케일 비교를 활성화하는 기능 플래그 Feature::$strictLocaleNegotiation이 추가되었습니다. 이전에는 Accept-language: en-US,en-GB;q=0.9와 같은 언어 헤더가 있는 요청에서 en-US 또는 en-GB 대신 첫 번째 허용 언어인 en을 반환했습니다. 값을 true로 설정하면 언어 코드(‘en’ - ISO 639-1)뿐만 아니라 지역 코드(‘en-US’ - ISO 639-1 + ISO 3166-1 alpha)까지 비교합니다.

페이지네이션

  • 현재 페이지의 항목 총 수와 범위 번호를 가져오는 새로운 기능이 추가되었습니다. 자세한 내용은 페이지의 항목 수 표시를 참조하세요.

데이터베이스

기타

  • MySQLi에서 MYSQLI_CLIENT_FOUND_ROWS를 사용하기 위한 새로운 설정 foundRows가 추가되었습니다.

  • 트랜잭션 상태를 초기화하는 BaseConnection::resetTransStatus() 메서드가 추가되었습니다. 자세한 내용은 거래 상태 재설정를 참조하세요.

  • SQLite3에 트랜잭션 중 디스크 플러시의 엄격성을 조정하는 새로운 설정 항목 synchronous가 추가되었습니다. 저널 모드가 WAL로 설정된 경우 이 설정을 변경하면 유용합니다.

라이브러리

  • File: File 클래스에 getSizeByBinaryUnit()getSizeByMetricUnit()이 추가되었습니다. File::getSizeByBinaryUnit()File::getSizeByMetricUnit()를 참조하세요.

  • FileCollection: FileCollection 클래스에 retainMultiplePatterns()이 추가되었습니다. FileCollection::retainMultiplePatterns()를 참조하세요.

  • Validation: FileRules 클래스에 min_dims 유효성 검사 규칙이 추가되었습니다. 유효성 검사를 참조하세요.

  • Validation: is_uniqueis_not_unique 규칙이 이제 첫 번째 매개변수의 일부로 선택적 dbGroup을 허용합니다. 유효성 검사를 참조하세요.

기타

  • Filters: 이제 before 또는 after에서 다른 인자로 필터를 두 번 이상 실행할 수 있습니다.

  • Services: 서비스 캐시를 초기화하는 BaseService::resetServicesCache() 메서드가 추가되었습니다. 서비스 캐시 초기화를 참조하세요.

  • Errors: “400 Bad Request”에 대한 기본 오류 페이지가 추가되었습니다.

메시지 변경사항

  • Validation.min_dims 메시지가 추가되었습니다.

  • Errors.badRequestErrors.sorryBadRequest가 추가되었습니다.

변경사항

예외

예외 클래스가 재설계되었습니다. 자세한 내용은 예외 디자인을 참조하세요. 이에 따라 다음과 같은 변경사항이 적용되었습니다:

  • 캐시 핸들러 클래스의 deleteMatching() 메서드가 이제 Exception 대신 CodeIgniter\Exceptions\BadMethodCallException을 발생시킵니다.

  • Cache\ResponseCache::get()이 이제 Exception 대신 CodeIgniter\Exceptions\RuntimeException을 발생시킵니다.

  • RuntimeException을 발생시키던 클래스들이 CodeIgniter\Exceptions\RuntimeException을 발생시키도록 변경되었습니다.

  • InvalidArgumentException을 발생시키던 클래스들이 CodeIgniter\Exceptions\InvalidArgumentException을 발생시키도록 변경되었습니다.

  • LogicException을 발생시키던 클래스들이 CodeIgniter\Exceptions\LogicException을 발생시키도록 변경되었습니다.

  • BadMethodCallException을 발생시키던 클래스들이 CodeIgniter\Exceptions\BadMethodCallException을 발생시키도록 변경되었습니다.

  • BadFunctionCallException을 발생시키던 클래스들이 CodeIgniter\Exceptions\BadFunctionCallException을 발생시키도록 변경되었습니다.

  • RedirectException은 이제 Exception 대신 CodeIgniter\Exceptions\RuntimeException을 상속합니다.

  • PageNotFoundException은 이제 OutOfBoundsException 대신 CodeIgniter\Exceptions\RuntimeException을 상속합니다.

사용 중단

  • Filters:
    • Filters$arguments$argumentsClass 속성이 사용 중단되었습니다. 더 이상 사용되지 않습니다.

    • Filters::getArguments() 메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다.

  • File:
    • FilegetSizeByUnit() 함수가 사용 중단되었습니다. 대신 getSizeByBinaryUnit() 또는 getSizeByMetricUnit()을 사용하세요.

버그 수정

  • Response:
    • Response 클래스로 설정된 헤더가 이제 우선순위를 가지며 PHP header() 함수로 수동 설정된 헤더를 대체합니다.

  • View: View::excerpt()에 멀티바이트 문자열 지원이 추가되었습니다.

  • Helpers: excerpt()에 멀티바이트 문자열 지원이 추가되었습니다.

수정된 버그의 전체 목록은 저장소의 CHANGELOG.md를 참조하세요.