次期バージョンのbaserCMSはどうなっていくのでしょう?
baserCMS4をリリースしてからはや5年となり、メンテナンスを重ね続け安定している状況ですが、水面下では、4年前より「ucmitz」というコードネームにてbaserCMS5の開発も進めてきました。
ここでは、そのbaserCMS5の開発における方針や取り組み、そして、今後について書きつらねたいと思います。
フレームワークのアップグレード
今回の一番の大掛かりの課題は、CakePHP4系対応。
昨今のPHPフレームワーク事情において、巷では数年前よりもっぱらLaravelが主流となりつつありますが、baserCMSにおいては、次期バージョンにおいても従来より利用しているCakePHPをアップグレードして引き続き利用する方針となりました。
Laravelの話もありましたが、オープンソースのWebアプリケーションとしては、規約を重視したCakePHPの方が可読性も上がり、レビューもしやすいだろうということで続行採用に至りました。
CakePHP3系から導入されたミドルウェアの仕組み、ORマッパーの大幅な変更と、ヘルパー関連の変更に非常に泣かされている状況です。
ただ、CakePHPも進化しており現在のバージョンは4となります。日本でもまた広く使われるようになるといいですね。
開発基本方針
開発における基本方針は次のとおり
- コアをコンパクトに、CakePHPのプラグインとして開発し疎結合化する
- プラグインを作りやすくするためのAPIを充実させる
- コアとして提供すべきプラグインは「コアプラグイン」として梱包する
- 単体テストとリファクタリングがしやすい構成を目指す
- ベストの仕組みを検討しつつ現状の着地点を探る
というわけで、baserCMS5は、CakePHPのプラグインとして動作するように開発を進めています。CakePHPを利用した開発プロジェクトにおいて、ComposerでbaserCMSがインストールできるイメージです。
これは、baserCMS4までが、CakePHPの 開発の雛形である app に依存しすぎていたため、疎結合化をすすめるためその方針としています。
モノレポの導入
コアをコンパクトにし、プラグインをどんどん作っていき、プラグイン向けのAPIを充実させるという方針のため、プラグイン(アプリ)が増えていきますが、別々のレポジトリでの開発だと非常に非効率です。
プラグイン自体は、コアパッケージの中にコアプラグインとして梱包する方針のため、単一のリポジトリに特定のプロジェクトのすべてのアプリを含めることができるようにするための「モノレポ」を採用しました。
baserCMS5では、MonorepoBuilder を利用しています。
同じレポジトリ内で開発することができ、リリース時には、別々のレポジトリに分割することができます。
DIコンテナとサービスクラスの導入
CakePHPの開発の場合、まず、Fat Controller になり、その後、Fat Model となる傾向があります。そうなってくるとモデルにおいてデータ操作とビジネスロジックがゴチャゴチャになって辛くなってきます。
そこで、ドメイン駆動設計にならい、ビジネスロジックはサービスクラスに分離した上で、CakePHP4.2から導入されたDIコンテナを利用し、コントローラーにサービスを注入する方式を取ることとしました。
プラグインインストールの仕組み
baserCMSのプラグインでは、データベースのテーブルやデータを利用する前提のものも多いのですが、プラグインをインストールする際にテーブルを初期化できる仕組みを作りたい。
CakePHPのテーブルを管理する仕組みとして Migrations がありますが、PHPで操作できる環境を提供してくれていたので助かりました。こちらを利用してインストールの仕組みを作りました。
プラグインのオートロード
CakePHPの通常の仕組みでは、プラグインを追加するためには、Composerを利用するか、手動で package.json とオートローダーを更新する必要があるのですが、baserCMSは、管理画面からプラグインの有効化、無効化をでき、動的にプラグインを読み込む仕組みを前提としているため、別の方法でなんとかしたいと考えました。
調べたところ、ClassLoader クラスの addPsr4() でなんとか動的に読み込むことができそうということで管理画面を使ったプラグインのオートロードに成功しました。
API対応とコントローラーの役割分担
baserCMS5からは、データベースのデータの取得、操作できる APIを提供する前提として開発しています。その際、管理画面用のコントローラー、フロントエンド用のコントローラー、API用のコントローラーを分けて構成するようにしました。
- src/
- Controller
- PagesController
- Admin
- PagesController
- Api
- PagesController
JWT認証
また、APIの認証には、JWT認証を採用しました。
ログイン用のAPIのエンドポイントにログイン名とパスワードを送りつけ認証が成功すると、アクセストークンとリフレッシュトークンを返します。
リソースにアクセスする際は、リクエストヘッダーにアクセストークンを付けてリクエストするイメージです。
開発環境
baserCMS4系と同様、Docker を利用しています。Mac環境の表示速度改善のため、Docker on Vagrant の環境も準備していますが、VirtualBox が M1チップになかなか対応しない、、、どうしたものか。
テスト駆動開発
ユニットテストは baserCMS4と変わらず PHPUnitを利用しています。
baserCMS5は、基本的に全メソッドを網羅する前提で開発しており、新しいメソッドはほとんどテスト駆動で開発を進めています。
継続的インテグレーション
CI(継続的インテグレーション)には、これまで TravisCI を利用していましたが、TravisCIが、有料化しサイトのドメインも変わったので、どうしたものかと考えていましたが、GitHub Actions が意外に簡単で便利でしたのでこちらに移行しました。
進行管理
baserCMS5の開発のほとんどは移行がメインとなるため、移行漏れがないような進行管理が必要です。
Reflection を駆使しつつ、プロジェクト内の全ファイルと全メソッドを自動的に洗い出し、スプレッドシートで管理できるようにしています。
また、各メソッドに対して、次の内容についてコメントヘッダーのアノテーションでマーキングできるようにし、スプレッドシートにも自動で反映できるようにしています。
- @checked:移行のためのチェックが完了しているかどうか
- @noTodo:残タスクがないかどうか
- @unitTest:ユニットテストの実装が完了しているかどうか
ドキュメント作成
ドキュメントは GitHub Pages を利用しています。また設計書として、ユースケース図、ドメインモデル図、クラス図を作成するため、PlantUML を使っています。
ネクストミーティングと合宿
baserCMS5の開発を推進するため、毎月第4水曜日19時に baserCMSネクストミーティングをオンラインで開催しています。そこでは、開発の進捗状況の共有や、現在発生している課題や新しい仕様の共有などを行っており、誰でも参加可能ですので、ご興味のある方は気軽に参加下さい。
また、毎月第3土曜日11:00〜19:00では、オンラインで開発合宿を開催しています。こちらもどなたでも参加可能です。開発についての質問なども受け付けていますのでこちらもご興味のある方はどうぞ。
ネクストミーティングと合宿の日程については、baserCMS公式サイトのNEWSで随時告知しています。
次の合宿は2022年1月15日11:00〜、ネクストミーティングは、2022年1月26日(水)19:00〜です。
baserCMS5の新機能要件
CakePHP4系への移行は非常に大掛かりなものとなりますが、その他に次の新機能要件を進めています。
- カスタムコンテンツ(管理画面の入力項目をノーコードで設定できる機能)
- REST API
- オートアップデート(パッチバージョンのみが対象)
- ダッシュボード機能強化
カスタムコンテンツとREST APIを実装することで、ヘッドレスCMSとしての対応も可能となります。
baserCMS5開発の今後
baserCMS5の開発は、コードネーム「ucmitz」として3つのマイルストーンを持ち、現在、1つ目の ucmitz バージョン1がリリース済です。現在、2022年2月にucmitzバージョン2をリリースできるよう開発を進めており、最終的に、2022年6月に、baserCMS5をリリースできることを目標としています。
現時点でもかなり伸び伸びとなっていますが、できるだけ予定どおりにリリースできるように頑張っていきたいと思います。
今回の記事で、baserCMS5の開発のご興味を持って頂いたのであれば、ぜひ合宿に参加しましょう!