4.5.8에서 4.6.0으로 업그레이드
설치 방법에 해당하는 업그레이드 지침을 참조하십시오.
주요 변경사항
예외 변경사항
일부 클래스에서 던지는 예외 클래스가 변경되었습니다. 일부 예외 클래스의 부모 클래스도 변경되었습니다. 자세한 내용은 변경 로그를 참조하십시오.
이 예외를 catch하는 코드가 있다면 예외 클래스를 변경하십시오.
Time::createFromTimestamp()의 타임존 변경
타임존을 명시적으로 전달하지 않으면 이제 Time::createFromTimestamp()는 UTC 타임존의 Time 인스턴스를 반환합니다. v4.4.6부터 v4.6.0 이전까지는 현재 설정된 기본 타임존의 Time 인스턴스가 반환되었습니다.
이 동작 변경은 새로운 DateTimeInterface::createFromTimestamp() 메서드를 추가한 PHP 8.4의 변경 사항에 맞춰 동작을 표준화합니다.
기본 타임존을 유지하려면 두 번째 매개변수로 타임존을 전달해야 합니다:
use CodeIgniter\I18n\Time;
$time = Time::createFromTimestamp(1501821586, date_default_timezone_get());
Time이 마이크로초를 유지합니다
이전 버전에서 Time은 일부 경우에 마이크로초를 잃었습니다. 이 버그들이 수정되었습니다.
이 수정으로 인해 Time 비교 결과가 달라질 수 있습니다:
use CodeIgniter\I18n\Time;
$time1 = new Time('2024-01-01 12:00:00.654321');
$time2 = new Time('2024-01-01 12:00:00');
$time1->equals($time2);
// Before: true
// After: false
이 경우 마이크로초를 제거해야 합니다:
use CodeIgniter\I18n\Time;
$time1 = new Time('2024-01-01 12:00:00.654321');
$time2 = new Time('2024-01-01 12:00:00');
// Removes the microseconds.
$time1 = Time::createFromFormat(
'Y-m-d H:i:s',
$time1->format('Y-m-d H:i:s'),
$time1->getTimezone(),
);
$time1->equals($time2);
// Before: true
// After: true
다음 경우에는 이제 마이크로초가 유지됩니다:
use CodeIgniter\I18n\Time;
$time = Time::createFromFormat('Y-m-d H:i:s.u', '2024-07-09 09:13:34.654321');
echo $time->format('Y-m-d H:i:s.u');
// Before: 2024-07-09 09:13:34.000000
// After: 2024-07-09 09:13:34.654321
use CodeIgniter\I18n\Time;
$time = new Time('1 hour ago');
echo $time->format('Y-m-d H:i:s.u');
// Before: 2024-07-26 21:05:57.000000
// After: 2024-07-26 21:05:57.857235
현재 시간을 가진 Time은 이전부터 마이크로초를 유지해 왔음에 주의하십시오.
use CodeIgniter\I18n\Time;
$time = Time::now();
echo $time->format('Y-m-d H:i:s.u');
// Before: 2024-07-26 21:39:32.249072
// After: 2024-07-26 21:39:32.249072
또한 int를 반환하는 메서드는 여전히 마이크로초를 잃습니다.
use CodeIgniter\I18n\Time;
$time1 = new Time('2024-01-01 12:00:00');
echo $time1->getTimestamp(); // 1704110400
$time2 = new Time('2024-01-01 12:00:00.654321');
echo $time2->getTimestamp(); // 1704110400
Time::setTimestamp()의 동작 수정
이전 버전에서 기본 타임존이 아닌 타임존을 가진 Time 인스턴스에 Time::setTimestamp()를 호출하면 잘못된 날짜/시간의 Time 인스턴스가 반환될 수 있었습니다.
이 버그가 수정되었으며 이제 DateTimeImmutable과 동일하게 동작합니다:
use CodeIgniter\I18n\Time;
// The Application Timezone is "UTC".
// Set $time1 timezone to "America/Chicago".
$time1 = Time::parse('2024-08-20', 'America/Chicago');
// The timestamp is "2024-08-20 00:00" in "UTC".
$stamp = strtotime('2024-08-20'); // 1724112000
// But $time2 timezone is "America/Chicago".
$time2 = $time1->setTimestamp($stamp);
echo $time2->format('Y-m-d H:i:s P');
// Before: 2024-08-20 00:00:00 -05:00
// After: 2024-08-19 19:00:00 -05:00
기본 타임존을 사용하는 경우에는 동작이 변경되지 않습니다:
use CodeIgniter\I18n\Time;
// The Application Timezone is "America/Chicago".
// $time1 timezone is "America/Chicago".
$time1 = Time::parse('2024-08-20');
// The timestamp is "2024-08-20 00:00" in "America/Chicago".
$stamp = strtotime('2024-08-20'); // 1724130000
// $time2 timezone is also "America/Chicago".
$time2 = $time1->setTimestamp($stamp);
echo $time2->format('Y-m-d H:i:s P');
// Before: 2024-08-20 00:00:00 -05:00
// After: 2024-08-20 00:00:00 -05:00
비정상적인 방법을 사용하는 Registrar
등록기관의 자동 탐색이 두 번 실행되는 것을 방지하기 위해 registrar 클래스가 로드되거나 인스턴스화될 때 CodeIgniter\Config\BaseConfig를 확장하는 설정 클래스를 인스턴스화하면 ConfigException이 발생합니다.
Registrar의 자동 탐색이 두 번 수행되면 설정 클래스의 속성에 중복 값이 추가될 수 있기 때문입니다.
모든 registrar 클래스(모든 네임스페이스의 Config/Registrar.php)는 로드되거나 인스턴스화될 때 어떤 설정 클래스도 인스턴스화하지 않도록 수정해야 합니다.
사용 중인 패키지/모듈에 이런 registrar 클래스가 포함된 경우 해당 패키지/모듈의 registrar 클래스를 수정해야 합니다.
다음은 더 이상 작동하지 않는 코드 예시입니다:
<?php
namespace CodeIgniter\Shield\Config;
use Config\App;
class Registrar
{
public function __construct()
{
$config = new App(); // Bad. When this class is instantiated, Config\App will be instantiated.
// Does something.
}
public static function Pager(): array
{
return [
'templates' => [
'module_pager' => 'MyModule\Views\Pager',
],
];
}
public static function hack(): void
{
$config = config('Cache');
// Does something.
}
}
Registrar::hack(); // Bad. When this class is loaded, Config\Cache will be instantiated.
세션 ID (SID) 변경
이제 세션 라이브러리는 PHP 기본값인 문자당 4비트 엔트로피를 가진 32자 SID를 강제로 사용합니다. 이 변경은 PHP 9의 동작에 맞추기 위한 것입니다.
즉, 다음 설정이 항상 사용됩니다:
session.sid_bits_per_character = 4
session.sid_length = 32
이전 버전에서는 PHP ini 설정이 적용되었습니다. 따라서 이 변경으로 인해 SID 길이가 달라질 수 있습니다.
이 변경을 수용할 수 없다면 Session 라이브러리를 커스터마이즈하십시오.
인터페이스 변경사항
일부 인터페이스가 변경되었습니다. 이를 구현하는 클래스는 변경 사항을 반영하도록 API를 업데이트해야 합니다. 자세한 내용은 변경 로그를 참조하십시오.
메서드 시그니처 변경사항
일부 메서드 시그니처가 변경되었습니다. 이를 확장하는 클래스는 변경 사항을 반영하도록 API를 업데이트해야 합니다. 자세한 내용은 변경 로그를 참조하십시오.
사용 중단 항목 제거
일부 사용 중단된 항목이 제거되었습니다. 이러한 항목을 아직 사용하거나 해당 클래스를 확장하고 있다면 코드를 업그레이드하십시오. 자세한 내용은 변경 로그를 참조하십시오.
호환성을 깨는 개선사항
필터 변경사항
Filters 클래스가 before 또는 after에서 동일한 필터를 다른 인수로 여러 번 실행할 수 있도록 변경되었습니다.
Filters를 확장하고 있다면 다음 변경 사항에 맞게 수정해야 합니다:
배열 속성
$filters와$filtersClasses의 구조가 변경되었습니다.속성
$arguments와$argumentsClass는 더 이상 사용되지 않습니다.Filters는 동일한 필터 클래스가 여러 번 인스턴스화되지 않도록 변경되었습니다. 필터 클래스가 before와 after 모두에 사용되면 동일한 인스턴스가 사용됩니다.
프로젝트 파일
프로젝트 공간 (root, app, public, writable)의 일부 파일이 업데이트되었습니다. 이 파일들은 system 범위 밖에 있으므로 직접 개입하지 않으면 변경되지 않습니다.
프로젝트 공간의 변경 사항 병합을 지원하는 서드파티 CodeIgniter 모듈이 있습니다: Packagist에서 탐색.
콘텐츠 변경 사항
다음 파일들은 중요한 변경(사용 중단 또는 시각적 조정 포함)이 있었으므로 업데이트된 버전을 애플리케이션에 병합하는 것을 권장합니다:
설정
- app/Config/Feature.php
Config\Feature::$autoRoutesImproved가true로 변경되었습니다.Config\Feature::$strictLocaleNegotiation이 추가되었습니다.
- app/Config/Routing.php
Config\Routing::$translateUriToCamelCase가true로 변경되었습니다.
- app/Config/Kint.php
Config\Kint::$richSort가 제거되었습니다. v6의 Kint는 더 이상AbstractRenderer::SORT_FULL을 사용하지 않습니다. 이 속성을 코드에 남겨두면 정의되지 않은 상수로 인해 런타임 오류가 발생합니다.
모든 변경 사항
다음은 프로젝트 공간에서 변경된 모든 파일의 목록입니다. 많은 파일이 런타임에 영향을 미치지 않는 단순한 주석이나 형식 변경일 수 있습니다:
app/Config/Cache.php
app/Config/Constants.php
app/Config/Database.php
app/Config/Feature.php
app/Config/Format.php
app/Config/Kint.php
app/Config/Routing.php
app/Config/Security.php
app/Views/errors/html/debug.css
app/Views/errors/html/error_400.php
preload.php
public/index.php
spark