Upon upgrading you may encounter several deprecation warnings. These warnings
are emitted by methods, options and functionality that will be removed in
CakePHP 4.x, but will continue to exist throughout the lifetime of 3.x. While we
recommend addressing deprecation issues as they are encountered, that is not
always possible. If you’d like to defer fixing deprecation notices, you can
disable them in your config/app.php:

'Error'=>['errorLevel'=>E_ALL&~E_DEPRECATED&~E_USER_DEPRECATED,]

The above error level will suppress deprecation warnings from CakePHP.

The Carbon library has been replaced with cakephp/chronos.
This new library is a fork of Carbon with no additional dependencies. It also
offer a calendar date object, and immutable versions of both date and datetime
objects.

The Date class allows you to cleanly map DATE columns into PHP objects.
Date instances will always fix their time to 00:00:00UTC. By default the
ORM creates instances of Date when mapping DATE columns now.

The FrozenTime, and FrozenDate classes were added. These classes offer
the same API as the Time object has. The frozen classes provide immutable
variants of Time and Date. By using immutable objects, you can prevent
accidental mutations. Instead of in-place modifications, modifier methods return
new instances:

In the above code $time and $newTime are different objects. The
$time object retains its original value, while $newTime has the modified
value. See the Immutable Dates and Times section for more information. As of 3.2,
the ORM can map date/datetime columns into immutable objects. See the
Enabling Immutable DateTime Objects section for more information.

In order to make setting headers related to Cross Origin Requests (CORS) easier,
a new CorsBuilder has been added. This class lets you define CORS related
headers with a fluent interface. See Setting Cross Origin Request Headers (CORS) for more information.

Router::redirect() now raises Cake\Network\Routing\RedirectException
when a redirect condition is reached. This exception is caught by the routing
filter and converted into a response. This replaces calls to
response->send() and allows dispatcher filters to interact with redirect
responses.

Shell::_stop() and Shell::error() no longer call exit(). Instead
they raise Cake\Console\Exception\StopException. If your shells/tasks are
catching \Exception where these methods would have been called, those catch
blocks will need to be updated so they don’t catch the StopException. By not
calling exit() testing shells should be easier and require fewer mocks.

A new configuration option Error.extraFatalErrorMemory can be set to the
number of megabytes to increase the memory limit by when a fatal error is
encountered. This allows breathing room to complete logging or error handling.