スポンサーリンク

CakePHP3から4への移行についてメモ

プラグイン含めてCakePHP3から4に移行したときの備忘録。現在進行形で移行作業中です。

事前準備

移行作業前に以下進めておいた方がいいと思います。

  1. CakePHP4について勉強用のリポジトリ作ったり、チュートリアル進めたりする。
    1. CakePHP4はAuthコンポーネントが非推奨になった。認証はauthentication、認可はauthorizationプラグインを使用するよう推奨されてるため、この辺理解しておく必要あり
    2. チュートリアルと例のページを読み進め、Usersを利用した認証、ArticlesなどのテーブルのCRUDについてbakeなど実施。
      テンプレートの拡張子と置き場所が変わったこと、一部のメソッドについてPHP7で追加された戻り値の型宣言が必要となったことについて確認
  2. CakePHP4のアップグレードガイド移行ガイド読む

私の場合のざっくりした移行手順

  1. CakePHP4に移行したいリポジトリについてmasterをベースとしたfeat-cakephp4-migrationブランチを作成(ブランチ名は適当)
  2. 移行したいリポジトリの外の適当なディレクトリにアップグレードツール(cakephp/upgrade)をクローン。
    cd upgrade
    composer install
  3. アップグレードコマンドで3系のctpテンプレートを4系のphpテンプレートにリネーム。置き場所がapp/src/Template→app/templatesに移動される。
    プラグインはプラグインで以下のように別途指定する必要あり。

    bin\cake.bat upgrade file_rename templates E:\workspace_git\my_cakephp3_init2.0\cake_app
    bin\cake.bat upgrade file_rename templates E:\workspace_git\my_cakephp3_init2.0\cake_app\plugins\Cake3ApiGenerator
    bin\cake.bat upgrade file_rename templates E:\workspace_git\my_cakephp3_init2.0\cake_app\plugins\ZipcodeJp
  4. app.phpを変更する
            'paths' => [
                'plugins' => [ROOT . DS . 'plugins' . DS],
    -            'templates' => [APP . 'Template' . DS],
    -            'locales' => [APP . 'Locale' . DS],
    +            'templates' => [ROOT . 'templates' . DS],
    +            'locales' => [RESOURCES . 'Locale' . DS],
            ],
  5. paths.phpを変更する
    /**
     * Path to the cache files directory. It can be shared between hosts in a multi-server setup.
     */
    define('CACHE', TMP . 'cache' . DS);
    +
    +/**
    + * Path to the resources directory.
    + */
    +define('RESOURCES', ROOT . DS . 'resources' . DS);
    
    /**
     * The absolute path to the "cake" directory, WITHOUT a trailing DS.
     *
     * CakePHP should always be installed with composer, so look there.
     */
    define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'vendor' . DS . 'cakephp' . DS . 'cakephp');
  6. Rector によるリファクタリングを実施する
    bin\cake.bat upgrade rector --rules phpunit80 E:\workspace_git\my_cakephp3_init2.0\cake_app\plugins\SoftDelete\tests
    bin\cake.bat upgrade rector --rules cakephp40 E:\workspace_git\my_cakephp3_init2.0\cake_app\plugins\SoftDelete\src
    bin\cake.bat upgrade rector --rules cakephp40 E:\workspace_git\my_cakephp3_init2.0\cake_app\plugins\ZipcodeJp\src
    bin\cake.bat upgrade rector --rules cakephp40 E:\workspace_git\my_cakephp3_init2.0\cake_app\plugins\Cake3ApiGenerator\src
    bin\cake.bat upgrade rector --rules cakephp40 E:\workspace_git\my_cakephp3_init2.0\cake_app\src
  7. アップグレードガイド通り以下のコマンドでCakePHP4をインストールしようとしたところcomposerにめちゃくちゃ怒られる。
    composer require --update-with-dependencies "cakephp/cakephp:4.0.*"
    1. 勉強用につくっていたCakePHP4のリポジトリのcomposer.jsonを参考に手作業で修正
      (左:勉強用のCakePHP4リポジトリ、右:CakePHP4に移行したいリポジトリ)
    2. 移行したいリポジトリのvendorディレクトリとcomposer.lockを削除
    3. composer installし直したら正常にインストールできた。
  8. 動作確認しつつエラーが出た箇所をちょこちょこ直していく

CakePHP4ライブラリのインストールが失敗した件について、今になって考えてみるとcomposer.jsonに記載されたbakeとかmigrationの周辺ライブラリが原因だったのかなーと思ったり。

rectorを使用した置換とプログラムを検索しての置換について

rectorを使用した置換については、変更の大きいテンプレートの移動は正確に動きましたがコントローラやコンソールコマンドなんかの置換はうまく反映されませんでした。。
そのため、画面にアクセスする→エラー出る→手作業で修正するみたいな手順が必要でした;;

プログラムを検索しての置換については私の開発するプロジェクト上での話にはなりますが以下のような置換や作業が必要でした。

置換前置換後メモ
$this->requiest->action$this->getRequest()->getParam(‘action’)これ置換前はたしかエラー出た
$this->request->$this->getRequest()->ゲッター使う
->newEntity()->newEmptyEntity()空のエンティティの作成方法が変わった
->setLayout(false)->disableAutoLayout()レイアウトを使わない設定について設定方法が変わった

  • config以下の設定ファイルについて頑張ってCakePHP4に寄せる
    • 勉強用CakePHP4のconfigディレクトリとDFで比較したら結構楽だった
  • Authコンポーネント周りの処理をauthenticationプラグインを使った実装に切り替える
    • 使わなくなったAuthorizeクラスとか削除
  • 「->hasPage」で全文検索
    • PaginatorヘルパーのhasPage()の第1と第2引数が入れ替わったので手作業で入れ替える

CakePHP3系の頃のバージョンをメンテ可能な状態で残す方法について

作ったプラグインについてはcomposer requireコマンドでインストールできるようpackagistで公開してたり、3系をまだ使うことがあるという理由で以下のような対応を行いました。

  1. masterをベースとした3.xという名前のブランチを作成
  2. 3.xブランチは特に変更せずいったんプッシュ
  3. CakePHP4用の開発ブランチをmasterにマージ
    1. プラグイン直下のcomposer.json内についてCakePHP本体とかの依存ライブラリのバージョンを整理する必要あり
  4. GitHub管理画面より3.xをベースとしたリリースを実施。バージョンはv1.〇.〇
  5. GitHub管理画面よりmasterをベースとしたリリースを実施。バージョンはv2.0.0

インストールの際は以下のようにバージョンを指定する必要あり。

# for CakePHP4
composer require imo-tikuwa/cakephp-zipcode-jp "2.*"

# for CakePHP3
composer require imo-tikuwa/cakephp-zipcode-jp "1.*"

このようにすることでCakePHP3と4の両方に対応することができました。
今後はmasterは4系を開発する際に使用し、3.xを3系の親ブランチとして扱うイメージ。
この方法が正しいかは正直よくわかってないです。どこかのプラグインで見たことがある気がするのですが、思い出せませんでした(^^;

移行が済んだ状態のブランチ(masterがCakePHP4用、3.xがCakePHP3用)


そんなこんなで移行が済んだプラグインのリポジトリが以下になります。

その他に専用の設定ファイルを元にオレオレbakeでCMSを構築するプラグイン、APIコントローラを生成するプラグイン等も移行中。

メモ

CakePHP3の時点で開発は相当しやすいので、PHPのバージョンアップが難しい場合はあえてアップグレードしなくてもいいかなーとは思いました(CakePHP4の動作はPHP7.2以上が必要)。


authorizationプラグインについては正直導入が難しかったのでやめました^q^
AdminプレフィックスのAppコントローラ内に認可処理を書いてます。
認可のコアな部分は自分で作ったUtilクラスがあるのでそれをauthorizationにうまく組み込みたかったけど何が必要なのかが分からず断念;;
たぶんリクエストをベースとした認可処理について書いてある以下のページの辺りが参考になりそう??( ・`ー・´)?
https://book.cakephp.org/authorization/2/en/request-authorization-middleware.html


オレオレbakeのプラグインはCakePHP4でシェルが非推奨になったことに起因してどう移行したものか考え中。。
CakePHP4用のcakephp/bakeのソースを読み進める必要があるのですが結構辛い。
CakePHP4ではbakeコマンドはシェルからコマンドクラスになってます。

CakePHP3のbake
CakePHP4のbake

その他、勉強用のCakePHP4の方だとbin/cake.bat実行時に色付きで表示されるけど、移行したリポジトリ側だとモノクロ表示になる。binディレクトリ内の差分を上書きしてみたりしたけど変化せず。
これは後回し

CakePHP4の勉強用リポジトリ
CakePHP4に移行中のリポジトリ

2020/10/12追記
移行中のリポジトリについてCakePHPを4.0.9から4.1.5にアップグレードしたらcakeコマンド実行時に色が付きました((^^))

タイトルとURLをコピーしました