CakePHP 3.9.xから4.3.xへアップグレード [エラー解決/移行ガイド]
今回は新規にプロジェクト(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