baserCMS 5で導入予定のCakePHP 3系は2系からどう変わった?


この記事はbaserCMS Advent Calendar 2018 17日目の記事です。

こんにちは!baserCMSリリースマネージャーの永冨隆之 (@tommy6073) です。

先日、島根にて、baserCMS 5の開発方針指針を決めるミーティングが行われました。
現在baserCMSはCakePHP 2系をベースとしていますが、次のメジャーバージョンであるbaserCMS 5ではCakePHP 3系(リリースされていれば4系の可能性も)をベースとすることが決まりました。

私自身はCakePHPは2系しか触ったことがなく(3系はチュートリアルをやったぐらい)、どういった変更が行われたのか知るいい機会だと考えたので、今更ではありますがCakePHP 2系から3系での変更点を改めてまとめてみたいと思います。

はじめに

まず見るべきページとしてCakePHP公式の移行ガイドがあります:
3.0 移行ガイド - 3.7

2.xから3.0の変更点がひととおり網羅されていますが、どれが重要かといった順序付けがされていません。
この記事では特に重要だと思われる変更についてピックアップして書いていこうと思います。

モデルの変更

一番の変更点と言えるのがモデルの変更です。互換性のないこの大きな変更の影響で、3系へのバージョンアップが進まなかったということもあるそうです。

こちらに関しては公式でも重要と捉えているようで、移行ガイドとは別にページが用意されています:
新 ORM アップグレードガイド - 3.7

「偽」ORMと言えるものだった2系のORMが真にORMになる変更となっています。

詳しくは公式ガイドなどを参照していただくとして、以下の2点が特に大きな変更点ではないかと思います:

  • Modelクラスがテーブル単位の操作を担うTable、レコード単位の操作を担うEntityといったクラスに分割された
  • ORMのクエリー結果が配列ではなくオブジェクトで返ってくるようになった。

参考記事:
CakePHP3のORMの中核を担う「Entity」とは何か 〜CakePHP2ユーザー向けに〜 - コネヒト開発者ブログ

Composerと名前空間の利用

Composerの利用が標準になり、CakePHPプロジェクトの作成自身もComposerにより行うように変更されました。

また、2系ではAppクラスを利用した独自のパス管理やローディングを行っていましたが、3系からはPSR-4に基づいた名前空間を利用するようになっています。
併せてフォルダ構成もPSR-4に基づいたものに変更されています。

その他

パフォーマンスの向上

ブートストラップ、ルーティング、ヘルパーテンプレートの作成などにおいて改善が行われ、パフォーマンスが向上しています。

セッション管理の改善

2系までは静的クラスによりセッションを管理していましたが、3系からはリクエストオブジェクトを$this->getRequest()->getSession()のように取得して管理できるようになりました。これによりテストがしやすくなり、CakePHPがPHPUnit 4.xを利用できるようになりました。

ビューセルの追加

ミニコントローラーとも言えるビューセルが追加されています。
ナビゲーションバーのような小さな部品に適用することが可能です。

TestShellの廃止

TestShellは廃止され、全てphpunitを介してテストを行うよう変更されています。

まとめ

以上、CakePHP 2系から3系への主な変更点をまとめてみました。

モデルの変更を中心に、様々な改善が行われており、正にメジャーアップデートと言えるものになっているな、という感想を抱きました。

なお、baserCMSではバージョン5の開発も含め、プロジェクトに貢献していただける方を募集しています。この機会にCakePHP 3系のプロジェクトに関わりたいという方がいたら是非ご参加ください。