Upgrade CakePHP do wersji 4

W tutorialu pokażę krok po kroku jak podnieść wersję CakePHP z 3 do 4. Zanim przystąpimy do upgradu CakePHP trzeba podnieść wersję php, ponieważ CakePHP 4 wymaga wersji php 7.2 lub wyższej.

Istnieje narzędzie konsolowe do aktualizacji - służy do zmiany nazw i przenoszenia szablonów (templates) i zasobów (resources):
git clone git://github.com/cakephp/upgrade
composer install --no-dev
bin/cake upgrade file_rename locales <path/to/app>
bin/cake upgrade file_rename templates <path/to/app>
Kolejnym krokiem jest ustawienie stałej dla resources w pliku /config/paths.php.
/**
 * Path to the resources directory.
 */
define('RESOURCES', ROOT . DS . 'resources' . DS);
Następnym krokiem jest zaktualizowanie ścieżek w pliku config/app.php.
return [
    'App' => [
       'paths' => [
            'plugins' => [ROOT . DS . 'plugins' . DS],
            'templates' => [ROOT . DS . 'templates' . DS],
            'locales' => [RESOURCES . 'locales' . DS],
        ],
    ],
];
Uruchom polecenie rector, aby automatycznie naprawić wiele przestarzałych wywołań metod.
bin/cake upgrade rector --rules phpunit80 <path/to/app/tests>
bin/cake upgrade rector --rules cakephp40 <path/to/app/src>
Podnieś wersję CakePHP i PHPUnit następującymi komendami.
composer require --dev --update-with-dependencies "phpunit/phpunit:^8.0"
composer require --update-with-dependencies "cakephp/cakephp:4.0.*"
Czasem opcja --update-with-dependencies może nie zadziałać. Źródłem problemu są wersje pakietów zależnych. Podmień je w pliku composer.json, a następnie i uruchom komendę upgradującą jeszcze raz.
{
    "require": {
        "php": ">=5.6",
        "cakephp/cakephp": "3.9.*",
        "cakephp/migrations": "^3.0.0", // ^2.0.0 to ^3.0.0
        "cakephp/plugin-installer": "^1.0",
        "mobiledetect/mobiledetectlib": "2.*"
    },
    "require-dev": {
        "cakephp/bake": "^2.0.3", // ^1.9.0 to ^2.0.3 
        "cakephp/cakephp-codesniffer": "^3.0",
        "cakephp/debug_kit": "^3.17.0", // ^3.17.0 to ^4.0.0
        "josegonzalez/dotenv": "3.*",
        "phpunit/phpunit": "^5|^6",
        "psy/psysh": "@stable"
    }
}
Warto przeczytać również CakePHP Migration Guide.