Release Date: Unreleased
4.3.0 release of CodeIgniter4
- TBD
The exceptions thrown by the database connection classes have been changed to
CodeIgniter\Database\Exceptions\DatabaseException
. Previously, different database drivers threw different exception classes, but these have been unified intoDatabaseException
.The exceptions thrown by the
execute()
method of Prepared Queries have been changed toDatabaseException
. Previously, different database drivers might throw different exception classes or did not throw exceptions, but these have been unified intoDatabaseException
.DBDebug
andCI_DEBUG
- To be consistent in behavior regardless of environments,
Config\Database::$default['DBDebug']
andConfig\Database::$tests['DBDebug']
has been changed totrue
by default. With these settings, an exception is always thrown when a database error occurs. - Now
DatabaseException
thrown inBaseBuilder
is thrown if$DBDebug
is true. Previously, it is thrown ifCI_DEBUG
is true. - The default value of
BaseConnection::$DBDebug
has been changed totrue
. - With these changes,
DBDebug
now means whether or not to throw an exception when an error occurs. Although unrelated to debugging, the name has not been changed. - Now when you delete without WHERE clause in
Model
,DatabaseException
is thrown even ifCI_DEBUG
is false. Previously, it is thrown ifCI_DEBUG
is true.
- To be consistent in behavior regardless of environments,
Previously, CodeIgniter's Exception Handler used the Exception code as the HTTP status code in some cases, and calculated the Exit code based on the Exception code. However there should be no logical connection with Exception code and HTTP Status Code or Exit code.
- Now the Exception Handler sets HTTP status code to
500
and set Exit code to the constantEXIT_ERROR
(=1
) by default. - You can change HTTP status code or Exit code to implement
HTTPExceptionInterface
orHasExitCodeInterface
in your Exception class. See :ref:`error-specify-http-status-code` and :ref:`error-specify-exit-code`.
For example, the Exit code has been changed like the following:
- If an uncaught
ConfigException
occurs, the Exit code isEXIT_CONFIG
(=3
) instead of12
. - If an uncaught
CastException
occurs, the Exit code isEXIT_CONFIG
(=3
) instead of9
. - If an uncaught
DatabaseException
occurs, the Exit code isEXIT_DATABASE
(=8
) instead of17
.
The following methods of the :doc:`Time <../libraries/time>` class had bugs that changed the state of the current object. To fix these bugs, the Time class has been fixed:
add()
modify()
setDate()
setISODate()
setTime()
sub()
- Now the
Time
class extendsDateTimeImmutable
and is completely immutable. TimeLegacy
class has been added for backward compatibility, which behaves the same as the unmodifiedTime
class.
- Helper: :php:func:`script_tag()` and :php:func:`safe_mailto()` no longer output
type="text/javascript"
in<script>
tag. - CLI: The
spark
file has been changed due to a change in the processing of Spark commands. - CLI:
CITestStreamFilter::$buffer = ''
no longer causes the filter to be registered to listen for streams. Now there is aCITestStreamFilter::registration()
method for this. See :ref:`upgrade-430-stream-filter` for details. - Database:
InvalidArgumentException
that is a kind ofLogicException
inBaseBuilder::_whereIn()
is not suppressed by the configuration. Previously ifCI_DEBUG
was false, the exception was suppressed. - Database: The data structure returned by :ref:`BaseConnection::getForeignKeyData() <metadata-getforeignkeydata>` has been changed.
- Database:
CodeIgniter\Database\BasePreparedQuery
class returns now a bool value for write-type queries instead of theResult
class object. - Routing:
RouteCollection::resetRoutes()
resets Auto-Discovery of Routes. Previously once discovered, RouteCollection never discover Routes files again even ifRouteCollection::resetRoutes()
is called.
Note
As long as you have not extended the relevant CodeIgniter core classes or implemented these interfaces, all these changes are backward compatible and require no intervention.
- Added new
OutgoingRequestInterface
that represents an outgoing request. - Added new
OutgoingRequest
class that implementsOutgoingRequestInterface
. - Now
RequestInterface
extendsOutgoingRequestInterface
. - Now
CURLRequest
extendsOutgoingRequest
. - Now
Request
extendsOutgoingRequest
.
- HTTP: Added missing
getProtocolVersion()
,getBody()
,hasHeader()
andgetHeaderLine()
method inMessageInterface
. - HTTP: Now
ResponseInterface
extendsMessageInterface
. - HTTP: Added missing
ResponseInterface::getCSP()
(andResponse::getCSP()
),ResponseInterface::getReasonPhrase()
andResponseInterface::getCookieStore()
methods. - Database: Added missing
CodeIgniter\Database\ResultInterface::getNumRows()
method. - See also Validation Changes.
ValidationInterface
has been changed to eliminate the mismatch between ValidationInterface
and the Validation
class.
The third parameter
$dbGroup
forValidationInterface::run()
has been added.The following methods are added to the interface:
ValidationInterface::setRule()
ValidationInterface::getRules()
ValidationInterface::getRuleGroup()
ValidationInterface::setRuleGroup()
ValidationInterface::loadRuleGroup()
ValidationInterface::hasError()
ValidationInterface::listErrors()
ValidationInterface::showError()
The return value of Validation::loadRuleGroup()
has been changed from null
to []
when the $group
is empty.
- The return types of
CodeIgniter\Database\BasePreparedQuery::close()
andCodeIgniter\Database\PreparedQueryInterface
have been changed tobool
(previously untyped). - The return type of
CodeIgniter\Database\Database::loadForge()
has been changed toForge
. - The return type of
CodeIgniter\Database\Database::loadUtils()
has been changed toBaseUtils
. - Parameter name
$column
has changed inTable::dropForeignKey()
to$foreignName
. - The second parameter
$index
ofBaseBuilder::updateBatch()
has changed to$constraints
. It now accepts types array, string, orRawSql
. Extending classes should likewise change types. - The
$set
parameter ofBaseBuilder::insertBatch()
andBaseBuilder::updateBatch()
now accepts an object of a single row of data. BaseBuilder::_updateBatch()
- The second parameter
$values
has changed to$keys
. - The third parameter
$index
has changed to$values
. The parameter type also has changed toarray
.
- The second parameter
The method signature of
Forge::dropKey()
has changed. An additional optional parameter$prefixKeyName
has been added.The method signature of
Forge::addKey()
has changed. An additional optional parameter$keyName
has been added.The method signature of
Forge::addPrimaryKey()
has changed. An additional optional parameter$keyName
has been added.The method signature of
Forge::addUniqueKey()
has changed. An additional optional parameter$keyName
has been added.The following method has an additional
$asQuery
parameter. When set totrue
the method returns a stand alone SQL query.CodeIgniter\Database\Forge::_processPrimaryKeys()
In addition to the added
$asQuery
parameter above the following methods also now return an array.CodeIgniter\Database\Forge::_processIndexes()
CodeIgniter\Database\Forge::_processForeignKeys()
API: The return type of
API\ResponseTrait::failServerError()
has been changed toResponseInterface
.The following methods have been changed to accept
ResponseInterface
as a parameter instead ofResponse
.Debug\Exceptions::__construct()
Services::exceptions()
- The call handler for Spark commands from the
CodeIgniter\CodeIgniter
class has been extracted. This will reduce the cost of console calls. - Added
spark filter:check
command to check the filters for a route. See :ref:`Controller Filters <spark-filter-check>` for the details. - Added
spark make:cell
command to create a new Cell file and its view. See :ref:`generating-cell-via-command` for the details. - Now
spark routes
command shows route names. See :ref:`URI Routing <routing-spark-routes>`. - Help information for a spark command can now be accessed using the
--help
option (e.g.php spark serve --help
) - Added methods
CLI::promptByMultipleKeys()
to support multiple value in input, unlikepromptByKey()
. See :ref:`prompt-by-multiple-keys` for details. - HTTP/3 is now considered a valid protocol.
- Added the
StreamFilterTrait
to make it easier to work with capturing data from STDOUT and STDERR streams. See :ref:`testing-cli-output`. - The CITestStreamFilter filter class now implements methods for adding a filter to streams. See :ref:`testing-cli-output`.
- Added the
PhpStreamWrapper
to make it easier to work with setting data tophp://stdin
. See :ref:`testing-cli-input`. - Added method :ref:`benchmark-timer-record` to measure performance in a callable. Also enhanced common function
timer()
to accept optional callable. - A boolean third parameter
$useExactComparison
is added toTestLogger::didLog()
which sets whether log messages are checked verbatim. This defaults totrue
. - Added method
CIUnitTestCase::assertLogContains()
which compares log messages by parts instead of the whole of the message.
- Added
upsert()
andupsertBatch()
methods to QueryBuilder. See :ref:`upsert-data`. - Added
deleteBatch()
method to QueryBuilder. See :ref:`delete-batch`. - Added
when()
andwhenNot()
methods to conditionally add clauses to the query. See :ref:`BaseBuilder::when() <db-builder-when>` for details. - Improved the SQL structure for
Builder::updateBatch()
. See :ref:`update-batch` for the details.
- Added
Forge::processIndexes()
allowing the creation of indexes on an existing table. See :ref:`adding-keys` for the details. - Added the ability to manually set index names. These methods include:
Forge::addKey()
,Forge::addPrimaryKey()
, andForge::addUniqueKey()
- The new method
Forge::dropPrimaryKey()
allows dropping the primary key on a table. See :ref:`dropping-a-primary-key`. - Fixed
Forge::dropKey()
to allow dropping unique indexes. This required theDROP CONSTRAINT
SQL command. - :php:meth:`CodeIgniter\\Database\\Forge::addForeignKey()` now includes a name parameter to set foreign key names manually. This is not supported in SQLite3.
- SQLSRV now automatically drops
DEFAULT
constraint when using :ref:`Forge::dropColumn() <db-forge-dropColumn>`.
- SQLite3 has a new Config item
busyTimeout
to set timeout when a table is locked. BaseConnection::escape()
now excludes theRawSql
data type. This allows passing SQL strings into data.- Improved data returned by :ref:`BaseConnection::getForeignKeyData() <metadata-getforeignkeydata>`. All DBMS returns the same structure.
- SQLite :ref:`BaseConnection::getIndexData() <db-metadata-getindexdata>` now can return pseudo index named
PRIMARY
for AUTOINCREMENT column, and each returned index data hastype
property. BasePreparedQuery::close()
now deallocates the prepared statement in all DBMS. Previously, they were not deallocated in Postgre, SQLSRV and OCI8. See :ref:`database-queries-stmt-close`.
- Added before and after events to
BaseModel::insertBatch()
andBaseModel::updateBatch()
methods. See :ref:`model-events-callbacks`. - Added
Model::allowEmptyInserts()
method to insert empty data. See :ref:`Using CodeIgniter's Model <model-allow-empty-inserts>` - Added new :ref:`entities-property-casting` class
IntBoolCast
for Entity.
- Publisher: Added methods
replace()
,addLineAfter()
andaddLineBefore()
to modify files in Publisher. See :ref:`Publisher <publisher-modifying-files>` for details. - Encryption: Now Encryption can decrypt data encrypted with CI3's Encryption. See :ref:`encryption-compatible-with-ci3`.
- CURLRequest: Added option version HTTP2 in :ref:`CURLRequest <curlrequest-version>`.
- Now you can autoload helpers by app/Config/Autoload.php.
- Added new Form helper function :php:func:`validation_errors()`, :php:func:`validation_list_errors()` and :php:func:`validation_show_error()` to display Validation Errors.
- You can set the locale to :php:func:`route_to()` if you pass a locale value as the last parameter.
- Added :php:func:`request()` and :php:func:`response()` functions.
- Added :php:func:`decamelize()` function to convert camelCase to snake_case.
- Added :php:func:`is_windows()` global function to detect Windows platforms.
Creation of void HTML elements like <input>
can be configured to exclude or not the solidus character
(/
) before the right angle bracket (>
) by setting the $html5
property in
app/Config/DocTypes.php. If you set it to true
, HTML5 compatible tags without /
like <br>
will be output.
The following items are affected:
- Typography class: Creation of
br
tag - View Parser: The
nl2br
filter - Form helper
- HTML helper
- Common Functions
- You can now log deprecation warnings instead of throwing exceptions. See :ref:`logging_deprecation_warnings` for details.
- Logging of deprecations is turned on by default.
- To temporarily enable throwing of deprecations, set the environment variable
CODEIGNITER_SCREAM_DEPRECATIONS
to a truthy value. Config\Logger::$threshold
is now, by default, environment-specific. For production environment, default threshold is still4
but changed to9
for other environments.
- Added
Config\App::$allowedHostnames
to set hostnames other than the hostname in the baseURL. - If you set
Config\App::$allowedHostnames
, URL-related functions such as :php:func:`base_url()`, :php:func:`current_url()`, :php:func:`site_url()` will return the URL with the hostname set inConfig\App::$allowedHostnames
if the current URL matches.
- Routing: Added
$routes->useSupportedLocalesOnly(true)
so that the Router returns 404 Not Found if the locale in the URL is not supported inConfig\App::$supportedLocales
. See :ref:`Localization <localization-in-routes>` - Routing: Added new
$routes->view()
method to return the view directly. See :ref:`View Routes <view-routes>`. - View: View Cells are now first-class citizens and can be located in the app/Cells directory. See :ref:`View Cells <app-cells>`.
- View: Added
Controlled Cells
that provide more structure and flexibility to your View Cells. See :ref:`View Cells <controlled-cells>` for details. - Validation: Added Closure validation rule. See :ref:`validation-using-closure-rule` for details.
- Config: Now you can specify Composer packages to auto-discover manually. See :ref:`Code Modules <modules-specify-composer-packages>`.
- Debug: Kint has been updated to 5.0.1.
- Updated English language strings to be more consistent.
- Added
CLI.generator.className.cell
andCLI.generator.viewName.cell
.
- Config
- All atomic type properties in
Config
classes have been typed.
- All atomic type properties in
- Changed the processing of Spark commands:
- The
CodeIgniter\CodeIgniter
no longer handles Spark commands. - The
CodeIgniter::isSparked()
method has been removed. - The
CodeIgniter\CLI\CommandRunner
class has been removed due to a change in Spark commands processing. - The system route configuration file
system/Config/Routes.php
has been removed. - The route configuration file
app/Config/Routes.php
has been changed. Removed include of system routes configuration file.
- The
RouteCollection::localizeRoute()
is deprecated.RouteCollection::fillRouteParams()
is deprecated. UseRouteCollection::buildReverseRoute()
instead.BaseBuilder::setUpdateBatch()
andBaseBuilder::setInsertBatch()
are deprecated. UseBaseBuilder::setData()
instead.- The public property
Response::$CSP
is deprecated. It will be protected. UseResponse::getCSP()
instead. CodeIgniter::$path
andCodeIgniter::setPath()
are deprecated. No longer used.- The public property
IncomingRequest::$uri
is deprecated. It will be protected. UseIncomingRequest::getUri()
instead. - The public property
IncomingRequest::$config
is deprecated. It will be protected. - The method
CLI::isWindows()
is deprecated. Useis_windows()
instead.
- Fixed a bug when all types of
Prepared Queries
were returning aResult
object instead of a bool value for write-type queries.