ホーム > カテゴリ > PHP・Laravel・CakePHP >

CakePHP 3.9.xから4.3.xへアップグレード [エラー解決/移行ガイド]

CentOSで各種サーバー構築(目次)

今回は新規にプロジェクト(CakePHP4.3系)を作成して、そこに元のソースファイルを徐々に移動していきます。公式の移行ツールがありますが完全ではないので手動で作業を行います。

前提条件

PHP8.1以降

関連記事:PHP8.xへアップグレードする [CentOS/Ubuntu]

注意事項

コピーする際のディレクトリの大文字小文字に注意

1. プロジェクトの作成

composer create-project --prefer-dist cakephp/app:4.3.* sample-project

移行作業中はデバックモードをオンにするとエラー箇所がわかりやすい。

2. config/app.php

// ロケール/タイムゾーンの設定(アプリ側)
'App' => [
    'encoding' => env('APP_ENCODING', 'UTF-8'),
    'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja_JP'),
    'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'Asia/Tokyo'),
],

// タイムゾーンの設定(MySQL/MariaDB側)
'Datasources' => [
    'default' => [
        'timezone' => 'Asia/Tokyo',
        'quoteIdentifiers' => true, // これは任意
    ],
],

3. config/app_local.php

// データベース設定
'Datasources' => [
    'default' => [
        'username' => 'ユーザー名',
        'password' => 'パスワード',
        'database' => 'データベース名',
        'log' => false,
    ]
  ]

sqlite関連のライブラリが未インストールの環境ではデータベース環境(test)のDATABASE_TEST_URLをnullにしないとエラーが発生する。

Database driver Cake\Database\Driver\Sqlite cannot be used due to a missing PHP extension or unmet dependency. Requested by connection "test"

'Datasources' => [
      'test' => [
         // 'url' => env('DATABASE_TEST_URL', 'sqlite://127.0.0.1/tests.sqlite'),
         'url' => env('DATABASE_TEST_URL', null)
      ] 
]

4. config/routes.php

4.3.xの元コードを全てコメントにして次を追加する。

return static function (RouteBuilder $routes) {
    $routes->scope('/', function (RouteBuilder $builder) {
      
      // ココの部分は自分の環境に合わせる
      $builder->connect('/', ['controller' => 'Home', 'action' => 'index']);

      // クラス名をURLにする
      $builder->fallbacks(DashedRoute::class);
    });
};

5. ビュー(テンプレート)

3.9系の「src\Template」は「templates」に移動となります。そして、拡張子は*.ctpから*.phpに変更する。

6. ビュー(src\AppView.php)

(3.9系)public function initialize()
(4.3系)public function initialize(): void

7. ビュー(CSRF)

(3.9系)$this->request->getParam('_csrfToken')
(4.3系)$this->request->getAttribute('csrfToken')

8. ビュー(フルベースURL)

(3.9系)$this->Url->build('/xxx?id=' . $item->id , true)
(4.3系)$this->Url->build('/xxx?id=' . $item->id , ['fullBase' => true])

9. ビュー(フォームラベル)

(3.9系)$this->Form->label('types-id', ['text' => __('種類'));
(4.3系)$this->Form->label('types-id', __('種類');

10. ビュー(ページネーション)

<?= $this->Paginator->counter(['format' => __('全{{count}}件中 {{start}} - {{end}}件のデータが表示されています。')]) ?>
<?= $this->Paginator->counter(__('全{{count}}件中 {{start}} - {{end}}件のデータが表示されています。')) ?>

11. コントローラー

ErrorController.phpは4.3系のファイルをそのまま使用。

12. コントローラー(その他)

(3.9系)public function initialize()
(4.3系)public function initialize(): void

(3.9系)xxx->newEntity();
(4.3系)xxx->newEmptyEntity();

(3.9系)return $this->redirect(['action' => 'index', 'lang_id' => $lang_id]]);
(4.3系)return $this->redirect(['action' => 'index', '?' => ['lang_id' => $lang_id]]);

13. モデル(テーブル)

(3.9系)public function initialize(array $config)
(4.3系)public function initialize(array $config): void

(3.9系)public function validationDefault(Validator $validator)
(4.3系)public function validationDefault(Validator $validator): Validator

(3.9系)public function buildRules(RulesChecker $rules)
(4.3系)public function buildRules(RulesChecker $rules): RulesChecker

14. コマンドオブジェクト(Commandを継承したクラス)

これはプロジェクトによって存在しない場合があります。

(3.9系)protected function buildOptionParser(ConsoleOptionParser $parser)
(4.3系)protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser

以上となります。これでほとんどのエラーが解決できるハズです。





関連記事



公開日:2022年04月13日 最終更新日:2022年04月14日
記事NO:02908