버전 4.3.0
릴리스 날짜: 2023년 1월 10일
CodeIgniter4 4.3.0 릴리스
주요 사항
Query Builder가 upsert(), upsertBatch(), deleteBatch() 를 지원하며, 이제 *batch() 메서드는 쿼리에서 데이터를 설정할 수 있습니다 (기여: sclubricants). Query Builder를 참고하세요.
Database Forge가 기존 테이블에 인덱스 추가 및 인덱스 이름 지정을 지원합니다 (기여: sclubricants). Forge를 참고하세요.
기본 설정을 더 안전하게 만들기 위해 기본 유효성 검사 규칙이 엄격한 규칙(Strict Rules)으로 변경되었습니다.
데이터베이스 오류가 발생할 때 예외가 발생하는 조건과 발생할 수 있는 예외 클래스가 변경되었습니다. 데이터베이스 오류 발생 시 예외를 참고하세요.
주요 변경사항
동작 변경
데이터베이스 오류 발생 시 예외
데이터베이스 연결 클래스에서 발생하는 예외가
CodeIgniter\Database\Exceptions\DatabaseException으로 변경되었습니다. 이전에는 데이터베이스 드라이버마다 다른 예외 클래스를 발생시켰지만, 이제DatabaseException으로 통일되었습니다.Prepared Query의
execute()메서드에서 발생하는 예외가DatabaseException으로 변경되었습니다. 이전에는 데이터베이스 드라이버마다 다른 예외 클래스를 발생시키거나 예외를 발생시키지 않았지만, 이제DatabaseException으로 통일되었습니다.트랜잭션 중에는
DBDebug가 true이더라도 기본적으로 예외가 발생하지 않습니다.DBDebug및CI_DEBUG변경환경에 관계없이 동작을 일관되게 하기 위해
Config\Database::$default['DBDebug']와Config\Database::$tests['DBDebug']의 기본값이true로 변경되었습니다. 이 설정으로 데이터베이스 오류 발생 시 항상 예외가 발생합니다. 이전에는 프로덕션 환경에서만false였습니다.이제
BaseBuilder에서 발생하는DatabaseException은$DBDebug가 true일 때 발생합니다. 이전에는CI_DEBUG가 true일 때 발생했습니다.BaseConnection::$DBDebug의 기본값이true로 변경되었습니다.이 변경으로
DBDebug는 이제 오류 발생 시 예외를 발생시킬지 여부를 의미합니다. 디버깅과 무관하지만 이름은 변경되지 않았습니다.DBDebug가true인 상태에서 트랜잭션을 실행할 때, 쿼리 오류가 발생하더라도 기본적으로 예외가 발생하지 않습니다. 이전에는 쿼리 오류 발생 시 모든 쿼리가 롤백되고 예외가 발생하여 오류 관리나 수동으로 트랜잭션 실행가 동작하지 않았습니다.이제
Model에서 WHERE 절 없이 삭제할 경우,CI_DEBUG가 false이더라도DatabaseException이 발생합니다. 이전에는CI_DEBUG가 true일 때 발생했습니다.
예외 발생 시 HTTP 상태 코드와 종료 코드
이전에는 CodeIgniter의 예외 핸들러가 일부 경우에 예외 코드를 HTTP 상태 코드로 사용하고, 예외 코드를 기반으로 종료 코드를 계산했습니다. 그러나 예외 코드와 HTTP 상태 코드 또는 종료 코드 사이에는 논리적 연관성이 없어야 합니다.
이제 예외 핸들러는 HTTP 상태 코드를
500으로 설정하고 종료 코드를 기본적으로 상수EXIT_ERROR(=1)로 설정합니다.예외 클래스에
HTTPExceptionInterface또는HasExitCodeInterface를 구현하여 HTTP 상태 코드 또는 종료 코드를 변경할 수 있습니다. 예외에 HTTP 상태 코드 지정와 예외에 종료 코드 지정를 참고하세요.
예를 들어, 종료 코드는 다음과 같이 변경되었습니다:
잡히지 않은
ConfigException이 발생하면 종료 코드는12대신EXIT_CONFIG(=3)입니다.잡히지 않은
CastException이 발생하면 종료 코드는9대신EXIT_CONFIG(=3)입니다.잡히지 않은
DatabaseException이 발생하면 종료 코드는17대신EXIT_DATABASE(=8)입니다.
Time
Time 클래스의 다음 메서드들은 현재 객체의 상태를 변경하는 버그가 있었습니다. 이 버그를 수정하기 위해 Time 클래스가 수정되었습니다:
add()
modify()
setDate()
setISODate()
setTime()
sub()
이제
Time클래스는DateTimeImmutable을 확장하며 완전히 불변(immutable)입니다.하위 호환성을 위해 수정 전
Time클래스와 동일하게 동작하는TimeLegacy클래스가 추가되었습니다.
기타
헬퍼:
script_tag()와safe_mailto()는 더 이상<script>태그에type="text/javascript"를 출력하지 않습니다.CLI: Spark 명령 처리 방식 변경으로 인해
spark파일이 변경되었습니다.CLI:
CITestStreamFilter::$buffer = ''는 더 이상 스트림을 수신하도록 필터를 등록하지 않습니다. 이제 이를 위한CITestStreamFilter::registration()메서드가 있습니다. 자세한 내용은 테스트에서 STDERR 및 STDOUT 스트림 캡처를 참고하세요.데이터베이스:
BaseBuilder::_whereIn()에서LogicException의 일종인InvalidArgumentException은 설정에 의해 억제되지 않습니다. 이전에는CI_DEBUG가 false이면 예외가 억제되었습니다.데이터베이스: BaseConnection::getForeignKeyData()가 반환하는 데이터 구조가 변경되었습니다.
데이터베이스:
CodeIgniter\Database\BasePreparedQuery클래스는 이제 쓰기 유형 쿼리에 대해Result클래스 객체 대신 bool 값을 반환합니다.모델:
Model::update()메서드는 이제 WHERE 절 없이 SQL 문을 생성하면DatabaseException을 발생시킵니다. 모델은 모든 레코드를 업데이트하는 작업을 지원하지 않습니다.라우팅:
RouteCollection::resetRoutes()가 라우트 자동 탐색을 초기화합니다. 이전에는 한 번 탐색되면RouteCollection::resetRoutes()를 호출해도 RouteCollection이 라우트 파일을 다시 탐색하지 않았습니다.
인터페이스 변경
참고
관련 CodeIgniter 코어 클래스를 확장하거나 이 인터페이스들을 구현하지 않았다면, 이 모든 변경사항은 하위 호환되며 별도의 조치가 필요하지 않습니다.
OutgoingRequestInterface
발신 요청을 나타내는 새로운
OutgoingRequestInterface가 추가되었습니다.OutgoingRequestInterface를 구현하는 새로운OutgoingRequest클래스가 추가되었습니다.이제
RequestInterface는OutgoingRequestInterface를 확장합니다.이제
CURLRequest는OutgoingRequest를 확장합니다.이제
Request는OutgoingRequest를 확장합니다.
기타
HTTP:
MessageInterface에 누락된getProtocolVersion(),getBody(),hasHeader(),getHeaderLine()메서드가 추가되었습니다.HTTP: 이제
ResponseInterface는MessageInterface를 확장합니다.HTTP: 누락된
ResponseInterface::getCSP()(및Response::getCSP()),ResponseInterface::getReasonPhrase(),ResponseInterface::getCookieStore()메서드가 추가되었습니다.데이터베이스: 누락된
CodeIgniter\Database\ResultInterface::getNumRows()메서드가 추가되었습니다.Validation Changes도 참고하세요.
메서드 시그니처 변경
유효성 검사 변경
ValidationInterface
ValidationInterface와 Validation 클래스 간의 불일치를 해소하기 위해 ValidationInterface가 변경되었습니다.
ValidationInterface::run()에 세 번째 매개변수$dbGroup이 추가되었습니다.다음 메서드들이 인터페이스에 추가되었습니다:
ValidationInterface::setRule()ValidationInterface::getRules()ValidationInterface::getRuleGroup()ValidationInterface::setRuleGroup()ValidationInterface::loadRuleGroup()ValidationInterface::hasError()ValidationInterface::listErrors()ValidationInterface::showError()
유효성 검사
$group이 비어 있을 때 Validation::loadRuleGroup()의 반환값이 null에서 []로 변경되었습니다.
데이터베이스
CodeIgniter\Database\BasePreparedQuery::close()와CodeIgniter\Database\PreparedQueryInterface의 반환 타입이bool로 변경되었습니다 (이전에는 타입 없음).CodeIgniter\Database\Database::loadForge()의 반환 타입이Forge로 변경되었습니다.CodeIgniter\Database\Database::loadUtils()의 반환 타입이BaseUtils로 변경되었습니다.Table::dropForeignKey()의 매개변수 이름$column이$foreignName으로 변경되었습니다.BaseBuilder::updateBatch()의 두 번째 매개변수$index가$constraints로 변경되었습니다. 이제 array, string, 또는RawSql타입을 허용합니다. 확장 클래스도 마찬가지로 타입을 변경해야 합니다.BaseBuilder::insertBatch()와BaseBuilder::updateBatch()의$set매개변수가 이제 단일 행 데이터의 객체를 허용합니다.BaseBuilder::_updateBatch()두 번째 매개변수
$values가$keys로 변경되었습니다.세 번째 매개변수
$index가$values로 변경되었습니다. 매개변수 타입도array로 변경되었습니다.
Database Forge
Forge::dropKey()의 메서드 시그니처가 변경되었습니다. 선택적 매개변수$prefixKeyName이 추가되었습니다.Forge::addKey()의 메서드 시그니처가 변경되었습니다. 선택적 매개변수$keyName이 추가되었습니다.Forge::addPrimaryKey()의 메서드 시그니처가 변경되었습니다. 선택적 매개변수$keyName이 추가되었습니다.Forge::addUniqueKey()의 메서드 시그니처가 변경되었습니다. 선택적 매개변수$keyName이 추가되었습니다.다음 메서드에
$asQuery매개변수가 추가되었습니다.true로 설정하면 메서드는 독립적인 SQL 쿼리를 반환합니다.CodeIgniter\Database\Forge::_processPrimaryKeys()
위에서 추가된
$asQuery매개변수 외에도 다음 메서드들은 이제 배열을 반환합니다.CodeIgniter\Database\Forge::_processIndexes()CodeIgniter\Database\Forge::_processForeignKeys()
기타
API:
API\ResponseTrait::failServerError()의 반환 타입이ResponseInterface로 변경되었습니다.다음 메서드들은
Response대신ResponseInterface를 매개변수로 허용하도록 변경되었습니다.Debug\Exceptions::__construct()Services::exceptions()
요청:
IncomingRequest::getJsonVar()의$index매개변수가 이제array,string,null값을 허용합니다.
개선
명령
CodeIgniter\CodeIgniter클래스에서 Spark 명령의 호출 핸들러가 분리되었습니다. 이로 인해 콘솔 호출 비용이 줄어듭니다.라우트에 대한 필터를 확인하는
spark filter:check명령이 추가되었습니다. 자세한 내용은 Controller Filters를 참고하세요.새 Cell 파일과 뷰를 생성하는
spark make:cell명령이 추가되었습니다. 자세한 내용은 명령을 통해 셀 생성를 참고하세요.이제
spark routes명령이 라우트 이름을 표시합니다. URI Routing를 참고하세요.이제
spark routes명령이 핸들러별로 출력을 정렬할 수 있습니다. 핸들러별 정렬를 참고하세요.이제
--help옵션을 사용하여 spark 명령의 도움말 정보에 접근할 수 있습니다 (예:php spark serve --help)promptByKey()와 달리 입력에서 여러 값을 지원하는CLI::promptByMultipleKeys()메서드가 추가되었습니다. 자세한 내용은 promptByMultipleKeys()를 참고하세요.HTTP/3이 이제 유효한 프로토콜로 인식됩니다.
테스팅
STDOUT 및 STDERR 스트림에서 데이터를 캡처하는 작업을 더 쉽게 하는
StreamFilterTrait가 추가되었습니다. CLI 출력 테스트를 참고하세요.CITestStreamFilter 필터 클래스에 이제 스트림에 필터를 추가하는 메서드가 구현되었습니다. CLI 출력 테스트를 참고하세요.
php://stdin에 데이터를 설정하는 작업을 더 쉽게 하는PhpStreamWrapper가 추가되었습니다. CLI 입력 테스트를 참고하세요.callable에서 성능을 측정하는 Timer::record() 메서드가 추가되었습니다. 또한 공통 함수
timer()가 선택적 callable을 허용하도록 개선되었습니다.TestLogger::didLog()에 로그 메시지를 그대로 비교할지 여부를 설정하는 boolean 세 번째 매개변수$useExactComparison이 추가되었습니다. 기본값은true입니다.전체 메시지 대신 부분적으로 로그 메시지를 비교하는
CIUnitTestCase::assertLogContains()메서드가 추가되었습니다.
데이터베이스
Query Builder
QueryBuilder에
upsert()와upsertBatch()메서드가 추가되었습니다. 데이터 Upsert를 참고하세요.QueryBuilder에
deleteBatch()메서드가 추가되었습니다. 일괄 삭제를 참고하세요.쿼리에 조건부로 절을 추가하는
when()와whenNot()메서드가 추가되었습니다. 자세한 내용은 BaseBuilder::when()을 참고하세요.Builder::updateBatch()의 SQL 구조가 개선되었습니다. 자세한 내용은 UpdateBatch를 참고하세요.쿼리에서
insertBatch(),updateBatch(),upsertBatch(),deleteBatch()를 허용하는BaseBuilder::setQueryAsData()가 추가되었습니다. insertBatch를 참고하세요.
Forge
기존 테이블에 인덱스를 생성할 수 있는
Forge::processIndexes()가 추가되었습니다. 자세한 내용은 테이블에 키 추가를 참고하세요.인덱스 이름을 수동으로 설정하는 기능이 추가되었습니다. 해당 메서드:
Forge::addKey(),Forge::addPrimaryKey(),Forge::addUniqueKey()테이블의 기본 키를 삭제할 수 있는 새 메서드
Forge::dropPrimaryKey()가 추가되었습니다. 기본 키 삭제를 참고하세요.유니크 인덱스 삭제를 허용하도록
Forge::dropKey()가 수정되었습니다. 이를 위해DROP CONSTRAINTSQL 명령이 필요했습니다.CodeIgniter\Database\Forge::addForeignKey()에 이제 외래 키 이름을 수동으로 설정하는 name 매개변수가 포함되었습니다. SQLite3에서는 지원되지 않습니다.SQLSRV는 이제 Forge::dropColumn() 사용 시
DEFAULT제약 조건을 자동으로 삭제합니다.
기타
SQLite3에 테이블이 잠겼을 때 타임아웃을 설정하는 새로운 설정 항목
busyTimeout이 추가되었습니다.BaseConnection::escape()는 이제RawSql데이터 타입을 제외합니다. 이를 통해 데이터에 SQL 문자열을 전달할 수 있습니다.BaseConnection::getForeignKeyData()가 반환하는 데이터가 개선되었습니다. 모든 DBMS가 동일한 구조를 반환합니다.
SQLite BaseConnection::getIndexData()는 이제 AUTOINCREMENT 컬럼에 대해
PRIMARY라는 의사 인덱스를 반환할 수 있으며, 반환된 각 인덱스 데이터에type속성이 있습니다.BasePreparedQuery::close()는 이제 모든 DBMS에서 prepared statement를 할당 해제합니다. 이전에는 Postgre, SQLSRV, OCI8에서 할당 해제되지 않았습니다. close()를 참고하세요.트랜잭션 중 예외를 발생시키는
BaseConnection::transException()이 추가되었습니다. 예외 던지기를 참고하세요.
모델
BaseModel::insertBatch()와BaseModel::updateBatch()메서드에 before/after 이벤트가 추가되었습니다. 쿼리 빌더 사용하기를 참고하세요.빈 데이터를 삽입하는
Model::allowEmptyInserts()메서드가 추가되었습니다. Using CodeIgniter’s Model를 참고하세요.Entity를 위한 새로운 속성 캐스팅 클래스
IntBoolCast가 추가되었습니다.
라이브러리
Publisher: Publisher에서 파일을 수정하는
replace(),addLineAfter(),addLineBefore()메서드가 추가되었습니다. 자세한 내용은 Publisher를 참고하세요.암호화: 이제 암호화 기능이 CI3의 암호화로 암호화된 데이터를 복호화할 수 있습니다. CI3과의 호환성을 유지하기 위한 설정를 참고하세요.
CURLRequest: CURLRequest에 HTTP2 버전 옵션이 추가되었습니다.
헬퍼와 함수
이제 app/Config/Autoload.php를 통해 헬퍼를 자동으로 로드할 수 있습니다.
유효성 검사 오류를 표시하는 새로운 Form 헬퍼 함수
validation_errors(),validation_list_errors(),validation_show_error()가 추가되었습니다.마지막 매개변수로 로케일 값을 전달하면
route_to()에 로케일을 설정할 수 있습니다.request()와response()함수가 추가되었습니다.camelCase를 snake_case로 변환하는
decamelize()함수가 추가되었습니다.Windows 플랫폼을 감지하는
is_windows()전역 함수가 추가되었습니다.
HTML5 호환성
app/Config/DocTypes.php에서 $html5 속성을 설정하여 <input>과 같은 빈 HTML 요소 생성 시 오른쪽 꺾쇠 괄호 (>) 앞의 슬래시 문자 (/) 포함 여부를 설정할 수 있습니다. true로 설정하면 <br>과 같이 / 없는 HTML5 호환 태그가 출력됩니다.
다음 항목들이 영향을 받습니다:
Typography 클래스:
br태그 생성View Parser:
nl2br필터Honeypot:
input태그Form 헬퍼
HTML 헬퍼
공통 함수
오류 처리
이제 예외를 발생시키는 대신 사용 중단 경고를 로그로 기록할 수 있습니다. 자세한 내용은 지원 중단 경고 로깅를 참고하세요.
사용 중단 로그 기록은 기본적으로 활성화되어 있습니다.
사용 중단 예외 발생을 일시적으로 활성화하려면 환경 변수
CODEIGNITER_SCREAM_DEPRECATIONS를 참 값으로 설정하세요.Config\Logger::$threshold는 이제 기본적으로 환경별로 다릅니다. 프로덕션 환경의 기본 임계값은 여전히4이지만 다른 환경에서는9로 변경되었습니다.
다중 도메인 지원
baseURL의 호스트명 외에 다른 호스트명을 설정하는
Config\App::$allowedHostnames가 추가되었습니다.Config\App::$allowedHostnames를 설정하면, 현재 URL이 일치할 경우base_url(),current_url(),site_url()와 같은 URL 관련 함수들이Config\App::$allowedHostnames에 설정된 호스트명을 포함한 URL을 반환합니다.
기타
라우팅: URL의 로케일이
Config\App::$supportedLocales에서 지원되지 않으면 Router가 404 Not Found를 반환하도록$routes->useSupportedLocalesOnly(true)가 추가되었습니다. Localization를 참고하세요.라우팅: 뷰를 직접 반환하는 새
$routes->view()메서드가 추가되었습니다. View Routes를 참고하세요.뷰: View Cell이 이제 1등 시민으로 app/Cells 디렉토리에 위치할 수 있습니다. View Cells를 참고하세요.
뷰: View Cell에 더 많은 구조와 유연성을 제공하는
Controlled Cells가 추가되었습니다. 자세한 내용은 View Cells를 참고하세요.유효성 검사: Closure 유효성 검사 규칙이 추가되었습니다. 자세한 내용은 클로저 규칙 사용를 참고하세요.
설정: 이제 자동 탐색할 Composer 패키지를 수동으로 지정할 수 있습니다. Code Modules를 참고하세요.
설정: 세션 설정을 처리하는
Config\Session클래스가 추가되었습니다.디버그: Kint가 5.0.2로 업데이트되었습니다.
요청: 원시 스트림에서 지정된 변수를 반환하는 새
$request->getRawInputVar()메서드가 추가되었습니다. Retrieving Raw data를 참고하세요.요청: 요청 유형을 조회하는 새
$request->is()메서드가 추가되었습니다. Determining Request Type를 참고하세요.
메시지 변경
영어 언어 문자열이 더 일관성 있도록 업데이트되었습니다.
CLI.generator.className.cell와CLI.generator.viewName.cell이 추가되었습니다.en/Errors.php 파일이 추가되었습니다.
변경
- 설정
Config클래스의 모든 원자 타입 속성에 타입이 지정되었습니다.기본값 변경에 관한 정보는 Upgrading를 참고하세요.
- Spark 명령 처리 방식이 변경되었습니다:
CodeIgniter\CodeIgniter는 더 이상 Spark 명령을 처리하지 않습니다.CodeIgniter::isSparked()메서드가 제거되었습니다.Spark 명령 처리 방식 변경으로 인해
CodeIgniter\CLI\CommandRunner클래스가 제거되었습니다.시스템 라우트 설정 파일
system/Config/Routes.php가 제거되었습니다.라우트 설정 파일
app/Config/Routes.php가 변경되었습니다. 시스템 라우트 설정 파일 포함이 제거되었습니다.
사용 중단
RouteCollection::localizeRoute()가 사용 중단되었습니다.RouteCollection::fillRouteParams()가 사용 중단되었습니다. 대신RouteCollection::buildReverseRoute()를 사용하세요.BaseBuilder::setUpdateBatch()와BaseBuilder::setInsertBatch()가 사용 중단되었습니다. 대신BaseBuilder::setData()를 사용하세요.공개 속성
Response::$CSP가 사용 중단되었습니다. 보호 속성으로 변경될 예정입니다. 대신Response::getCSP()를 사용하세요.CodeIgniter::$path와CodeIgniter::setPath()가 사용 중단되었습니다. 더 이상 사용되지 않습니다.공개 속성
IncomingRequest::$uri가 사용 중단되었습니다. 보호 속성으로 변경될 예정입니다. 대신IncomingRequest::getUri()를 사용하세요.공개 속성
IncomingRequest::$config가 사용 중단되었습니다. 보호 속성으로 변경될 예정입니다.CLI::isWindows()메서드가 사용 중단되었습니다. 대신is_windows()를 사용하세요.새로운 세션 설정 클래스
Config\Session을 위해Config\App의 세션 속성들이 사용 중단되었습니다.
버그 수정
모든 유형의
Prepared Query가 쓰기 유형 쿼리에 대해 bool 값 대신Result객체를 반환하던 버그가 수정되었습니다.IncomingRequest::getVar()또는IncomingRequest::getJsonVar()메서드를 사용하는 JSON 요청에서 변수 필터링 버그가 수정되었습니다.IncomingRequest::getVar()또는IncomingRequest::getJsonVar()메서드에서 지정된 인덱스를 사용할 때 변수 타입이 변경될 수 있는 버그가 수정되었습니다.CSP가 활성화되어 있을 때 Honeypot 필드가 나타나는 버그가 수정되었습니다. Honeypot과 CSP도 참고하세요.
수정된 버그의 전체 목록은 저장소의 CHANGELOG.md를 참고하세요.