버전 4.4.0
릴리스 날짜: 2023년 8월 25일
CodeIgniter4 4.4.0 릴리스
주요 사항
The Debug Toolbar now has a new “Hot Reload” feature (contributed by lonnieezell). See Testing.
주요 변경사항
동작 변경
URI::setSegment()와 존재하지 않는 세그먼트
마지막 +2 세그먼트를 설정할 때 이제 예외가 발생합니다. 이전 버전에서는 마지막 세그먼트 +3 이상이 지정된 경우에만 예외가 발생했습니다. URI::setSegment() 변경를 참고하세요.
현재 마지막 세그먼트의 다음 세그먼트 (+1)는 이전과 같이 설정할 수 있습니다.
Factories
네임스페이스가 있는 클래스 이름 전달
이제 preferApp는 네임스페이스 없이 클래스 이름을 요청할 때만 동작합니다.
예를 들어, model(\Myth\Auth\Models\UserModel::class) 또는 model('Myth\Auth\Models\UserModel')을 호출할 때:
이전:
preferApp가 true(기본값)이고App\Models\UserModel이 존재하면 반환
preferApp가 false이고Myth\Auth\Models\UserModel이 존재하면 반환이후:
preferApp가 true(기본값)이더라도Myth\Auth\Models\UserModel반환
model()호출 전에Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel')을 정의하면App\Models\UserModel반환
실수로 존재하지 않는 클래스 이름을 전달한 경우, 이전 버전은 preferApp 기능 때문에 App 또는 Config 네임스페이스의 클래스 인스턴스를 반환했을 것입니다.
예를 들어, 컨트롤러 (namespace App\Controllers)에서 실수로 config(Config\App::class)를 호출한 경우 (앞의 \가 누락된 클래스 주의), 실제로는 App\Controllers\Config\App을 전달한 것입니다. 하지만 그 클래스가 존재하지 않으므로, 이제 Factories는 null을 반환합니다.
속성 이름
속성 Factories::$basenames이 $aliases로 이름이 변경되었습니다.
자동 로더
이전에는 CodeIgniter의 자동 로더가 .php 확장자로 끝나는 클래스 이름 로딩을 허용했습니다. 이는 new Foo.php()와 같이 객체를 인스턴스화하는 것이 가능했으며 new Foo()로 인스턴스화되었습니다. Foo.php는 유효하지 않은 클래스 이름이므로, 자동 로더의 이 동작이 변경되었습니다. 이제 그러한 클래스를 인스턴스화하면 실패합니다.
CodeIgniter와 exit()
CodeIgniter::run() 메서드는 더 이상 exit(EXIT_SUCCESS)를 호출하지 않습니다. exit 호출이 public/index.php로 이동되었습니다.
사이트 URI 변경
URI 클래스를 확장하고 사이트 URI를 나타내는 새로운 SiteURI 클래스가 추가되었으며, 이제 현재 URI가 필요한 많은 곳에서 사용됩니다.
컨트롤러에서 $this->request->getUri()는 SiteURI 인스턴스를 반환합니다. 또한, site_url(), base_url(), current_url()은 내부적으로 SiteURI를 사용합니다.
getPath()
getPath() 메서드는 이제 항상 앞의 /를 포함한 전체 URI 경로를 반환합니다. 따라서 baseURL에 하위 디렉토리가 있고 baseURL에 대한 상대 경로를 얻으려면, 대신 새로운 getRoutePath() 메서드를 사용해야 합니다.
예를 들어:
baseURL: http://localhost:8888/CodeIgniter4/
The current URI: http://localhost:8888/CodeIgniter4/foo/bar
getPath(): /CodeIgniter4/foo/bar
getRoutePath(): foo/bar
사이트 URI 값
SiteURI 클래스는 이전보다 더 엄격하게 사이트 URI를 정규화하며, 일부 버그가 수정되었습니다.
그 결과, 프레임워크는 이전 버전과 약간 다르게 사이트 URI나 URI 경로를 반환할 수 있습니다. 예를 들어, index.php 뒤에 /가 추가됩니다:
http://example.com/test/index.php?page=1
↓
http://example.com/test/index.php/?page=1
인터페이스 변경
참고
관련 CodeIgniter 코어 클래스를 확장하거나 이 인터페이스들을 구현하지 않았다면, 이 모든 변경사항은 하위 호환되며 별도의 조치가 필요하지 않습니다.
유효성 검사:
ValidationInterface에getValidated()메서드가 추가되었습니다.
메서드 시그니처 변경
매개변수 타입 변경
- 서비스:
Services::security()의 첫 번째 매개변수가Config\App에서Config\Security로 변경되었습니다.Services::session()의 첫 번째 매개변수가Config\App에서Config\Session으로 변경되었습니다.
- 세션:
Session::__construct()의 두 번째 매개변수가Config\App에서Config\Session으로 변경되었습니다.데이터베이스의
BaseHandler,DatabaseHandler,FileHandler,MemcachedHandler,RedisHandler의__construct()첫 번째 매개변수가Config\App에서Config\Session으로 변경되었습니다.
보안:
Security::__construct()의 첫 번째 매개변수가Config\App에서Config\Security로 변경되었습니다.유효성 검사:
Validation::check()의 메서드 시그니처가 변경되었습니다.$rule매개변수의string타입힌트가 제거되었습니다.CodeIgniter:
CodeIgniter::setRequest()의 메서드 시그니처가 변경되었습니다.$request매개변수의Request타입힌트가 제거되었습니다.- FeatureTestCase:
FeatureTestCase::populateGlobals()의 메서드 시그니처가 변경되었습니다.$request매개변수의Request타입힌트가 제거되었습니다.FeatureTestCase::setRequestBody()의 메서드 시그니처가 변경되었습니다.$request매개변수의Request타입힌트와 반환 타입Request가 제거되었습니다.
추가된 매개변수
라우팅:
RouteCollection::__construct()에 세 번째 매개변수Routing $routing이 추가되었습니다.
제거된 매개변수
서비스:
Services::exceptions()의 두 번째 매개변수$request와 세 번째 매개변수$response가 제거되었습니다.오류 처리:
CodeIgniter\Debug\Exceptions::__construct()의 두 번째 매개변수$request와 세 번째 매개변수$response가 제거되었습니다.
반환 타입 변경
자동 로더: spl_autoload_register와 spl_autoload_unregister 함수에서 콜백으로 호환되도록 loadClass와 loadClassmap 메서드의 반환 시그니처가 void로 변경되었습니다.
개선
명령
테스팅
데이터베이스
MySQLi: SQL 쿼리 후 가져온 변수 타입을 데이터베이스에 설정된 타입과 일치시키기 위해 Database Config에
numberNative속성이 추가되었습니다. Database Configuration를 참고하세요.SQLSRV: 필드 메타데이터에 이제
nullable이 포함됩니다. $db->getFieldData()를 참고하세요.
모델
메서드 이름 충돌을 피하기 위해 Entity에 특별한 getter/setter가 추가되었습니다. 특수 Getter/Setter를 참고하세요.
라이브러리
유효성 검사: 실제 유효성 검사된 데이터를 가져오는
Validation::getValidated()메서드가 추가되었습니다. 자세한 내용은 검사된 데이터 가져오기를 참고하세요.이미지: 이제
$quality옵션을 사용하여 WebP 이미지를 압축할 수 있습니다.업로드된 파일: 디렉토리 업로드를 통해 파일이 업로드된 경우 파일의 full_path 인덱스 값을 반환하는
UploadedFiles::getClientPath()메서드가 추가되었습니다.CURLRequest: 요청 옵션
proxy가 추가되었습니다. CURLRequest Class를 참고하세요.URI:
URI를 확장하고 사이트 URI를 나타내는 새로운SiteURI클래스가 추가되었습니다.
헬퍼와 함수
배열: 데이터 값을 함께 그룹화하는
array_group_by()헬퍼 함수가 추가되었습니다. 점 표기법 구문을 지원합니다.공통:
force_https()는 더 이상 애플리케이션을 종료하지 않고RedirectException을 발생시킵니다.
기타
DownloadResponse: 브라우저에서 파일을 표시하기 위해
Content-Disposition: inline헤더를 설정하는DownloadResponse::inline()메서드가 추가되었습니다. 자세한 내용은 브라우저에서 파일 열기를 참고하세요.뷰:
renderSection()에 표시 후 데이터 자동 정리를 방지하는 선택적 2번째 매개변수$saveData가 추가되었습니다. 자세한 내용은 View Layouts를 참고하세요.필터: 이제 $filters 속성과 함께 필터 인수를 사용할 수 있습니다.
요청: 유효한 로케일을 설정하는
IncomingRequest::setValidLocales()메서드가 추가되었습니다.테이블: 행 컬럼을 제목과 동기화하는
Table::setSyncRowsWithHeading()메서드가 추가되었습니다. 자세한 내용은 제목과 행 동기화를 참고하세요.오류 처리: 이제 사용자 정의 예외 처리기를 사용할 수 있습니다.
- RedirectException:
ResponseInterface를 구현하는 객체를 첫 번째 인수로 받을 수도 있습니다.ResponsableInterface를 구현합니다.
- Factories:
이제 실제로 로드될 클래스 이름을 정의할 수 있습니다. 로드할 클래스 이름 정의를 참고하세요.
설정 캐싱이 구현되었습니다. 자세한 내용은 Config Caching을 참고하세요.
메시지 변경
Core.invalidDirectory오류 메시지가 추가되었습니다.HTTP.invalidHTTPProtocol오류 메시지가 개선되었습니다.
변경
이미지:
GDHandler에서 WebP의 기본 품질이 80에서 90으로 변경되었습니다.- 설정:
app/Config/App.php에서 사용 중단된 Cookie 항목들이 제거되었습니다.
app/Config/App.php에서 사용 중단된 Session 항목들이 제거되었습니다.
app/Config/App.php에서 사용 중단된 CSRF 항목들이 제거되었습니다.
라우팅 설정이 app/Config/Routing.php 설정 파일로 이동되었습니다. 업그레이드 가이드를 참고하세요.
DownloadResponse: 응답 헤더를 생성할 때 이전에 지정된 경우
Content-Disposition헤더를 교체하지 않습니다.- 자동 로더:
v4.4.0 이전에는 CodeIgniter 자동 로더가 특정 운영 체제의 파일 이름에 허용되지 않는 특수 문자를 허용하지 않았습니다. 사용 가능한 기호는
/,_,.,:,\와 공백이었습니다. 따라서(,)등의 특수 문자가 포함된 폴더에 CodeIgniter를 설치하면 작동하지 않았습니다. v4.4.0부터 이 제한이 제거되었습니다.Autoloader::loadClass()와Autoloader::loadClassmap()메서드가 이제 모두@internal로 표시됩니다.
RouteCollection: 성능을 위해 보호 속성
$routes의 배열 구조가 수정되었습니다.HSTS: 이제
force_https()또는Config\App::$forceGlobalSecureRequests = true는 리다이렉트 후 HTTP 요청 메서드를 유지할 수 있는 HTTP 상태 코드 307을 설정합니다. 이전 버전에서는 302였습니다.
사용 중단
Entity:
Entity::setAttributes()가 사용 중단되었습니다. 대신Entity::injectRawData()를 사용하세요.오류 처리:
CodeIgniter\Debug\Exceptions의 많은 메서드와 속성이 사용 중단되었습니다. 이 메서드들이BaseExceptionHandler또는ExceptionHandler로 이동되었기 때문입니다.자동 로더:
Autoloader::sanitizeFilename()이 사용 중단되었습니다.- CodeIgniter:
CodeIgniter::$returnResponse속성이 사용 중단되었습니다. 더 이상 사용되지 않습니다.CodeIgniter::$cacheTTL속성이 사용 중단되었습니다. 더 이상 사용되지 않습니다. 대신ResponseCache를 사용하세요.CodeIgniter::cache()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다. 대신ResponseCache를 사용하세요.CodeIgniter::cachePage()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다. 대신ResponseCache를 사용하세요.CodeIgniter::generateCacheName()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다. 대신ResponseCache를 사용하세요.CodeIgniter::callExit()메서드가 사용 중단되었습니다. 더 이상 사용되지 않습니다.
RedirectException:
\CodeIgniter\Router\Exceptions\RedirectException이 사용 중단되었습니다. 대신\CodeIgniter\HTTP\Exceptions\RedirectException을 사용하세요.세션:
Session의 속성$sessionDriverName,$sessionCookieName,$sessionExpiration,$sessionSavePath,$sessionMatchIP,$sessionTimeToUpdate,$sessionRegenerateDestroy가 사용 중단되었으며 더 이상 사용되지 않습니다. 대신$config를 사용하세요.보안:
Security의 속성$csrfProtection,$tokenRandomize,$tokenName,$headerName,$expires,$regenerate,$redirect가 사용 중단되었으며 더 이상 사용되지 않습니다. 대신$config를 사용하세요.- URI:
URI::$uriString이 사용 중단되었습니다.URI::$baseURL이 사용 중단되었습니다. 대신SiteURI를 사용하세요.URI::setSilent()이 사용 중단되었습니다.URI::setScheme()이 사용 중단되었습니다. 대신withScheme()을 사용하세요.URI::setURI()이 사용 중단되었습니다.
- IncomingRequest:
IncomingRequest::detectURI()가 사용 중단되었으며 더 이상 사용되지 않습니다.IncomingRequest::detectPath()가 사용 중단되었으며 더 이상 사용되지 않습니다.SiteURIFactory로 이동되었습니다.IncomingRequest::parseRequestURI()가 사용 중단되었으며 더 이상 사용되지 않습니다.SiteURIFactory로 이동되었습니다.IncomingRequest::parseQueryString()가 사용 중단되었으며 더 이상 사용되지 않습니다.SiteURIFactory로 이동되었습니다.IncomingRequest::setPath()가 사용 중단되었습니다.
버그 수정
Auto Routing (Improved): 이전 버전에서
$translateURIDashes가 true일 때, 대시를 사용하는 URI (예: foo-bar)와 밑줄을 사용하는 URI (예: foo_bar) 두 URI가 하나의 컨트롤러 메서드에 해당했습니다. 이 버그가 수정되었습니다. 이제 밑줄을 사용하는 URI (foo_bar)에는 접근할 수 없습니다.출력 버퍼링: 출력 버퍼링 버그 수정.
ControllerTestTrait:
ControllerTestTrait::withUri()가 URI를 포함한 새 Request 인스턴스를 생성합니다. Request 인스턴스가 URI 인스턴스를 가져야 하기 때문입니다. 또한 URI 문자열의 호스트명이Config\App에서 유효하지 않으면 유효한 호스트명이 설정됩니다.
수정된 버그의 전체 목록은 저장소의 CHANGELOG.md를 참고하세요.