この記事はCodeIgniter Advent Calendar 2016の25日目、最後の記事です。

アドベントカレンダーってクリスマスイブ(降誕祭開始)までを数えるものなので25日目があるというのも変な感じがしますが、まあいいんでしょうか。日本だし。

というわけでクリスマスプレゼント! じゃん! CodeIgniter4のマニュアル邦訳です!

完成まで程遠いんですけどね。許してください。原文もまだアルファ版です。目次からリンクが外れてたり、まだ書かれていないページもあります。
翻訳進捗は現在20.5%です(文節単位)。正月にもうすこし進むでしょう。都度更新しています。URLはCI4リリースまでに変えてしまうかもしれません。

CI_Loaderはなくなりました

ver 3以前で重要な役割を担っていたCI_Loaderはなくなりました。代わりにautoloaderをバリバリ利用するように変わっています。
Configまでautoloaderを利用するようになり、設定値取得クラスもなくなりました。newしてプロパティを読みます。

$config = new \Config\EmailConfig();

// クラスのプロパティとして設定値にアクセスします
$protocol = $config->protocol;
$mailpath = $config->mailpath;

オブジェクト指向へのピュアなアプローチを目指している感じが伝わります。シングルトンは悪です。

また、従来型アプローチとしてServiceクラスがあります。クラス管理としてはこちらがメインです。アプリケーション側で継承するのが前提で、Config配下にあります。設定ファイルとして使用せよ、ということと思います。
コードを見ると「シンプルさのためにDIコンテナの代わりを作った」と書いてあります。柔軟ではない何かになっていますが、抽象度が低いのでコードリーディング時にクラスを特定しやすく、うまくコード設計すれば初級者でもメンテしやすいかもしれません。コアクラスを差し替える際にはこのクラスを使うことになります。

いずれにせよ、CI_LoaderがなくなりConfigが変わったことで、過去資産との互換性は壊滅的と言えましょう。CIべったりなサードパーティライブラリは書き直しです。

コントローラはそれほど変わっていません

コントローラのページはそれほど見た目が変わっていません。ルータは大きく変わったのですが、コントローラにも相変わらず _remap() は健在です。役割はほぼそのままになっています。

ビューは大きく拡張されました

ビューも役割としてはそれほど変わらないのですが、マニュアルのページが4つになりました。機能は大きく拡張されています。

HMVCへの要求を一部受け入れて作ったものかなと思います。個人的にはあまり歓迎していません。根幹機能が複雑になった割にメリットが少ないのです。変数のエスケープをコントローラで意識せねばならず、独自にテンプレートエンジンを入れたほうがクラス設計として素直そうです。

モデルは全く変わりました

「一般的なトピック」の章立てからModelが消えました。代わりにデータベースの章に「CodeIgniterのモデルの利用」というページができたのですが、FuelPHPのO/Rマッパー的な何かに変わっています。クエリビルダも別にあります。

ビューもそうですが、モデルにもFuelPHPユーザへの秋波のようなものを感じます。嫌ならその機能は使うなということなのでしょうけど、フレームワークレベルで選択肢が増えるとプロジェクト内で「活用」されてしまうことがあるので、単純さを求めてCodeIgniterを選択しているならマイナスポイントになります。

余談ですがこの「嫌なら使わなければいい」「シンプルさを求めたい」の対立はJava の J2SE 5.0 機能拡張時にも発生したもので、拡張方向に流れるのは仕方ないのかもしれません。Javaがその後どういう評価を得られたかは把握していません。ご存じの方は教えていただけるとありがたいです。

他の着眼すべきとしては、バリデーションの一部がモデルでも実行可能になったことがあります。もちろんコントローラでもバリデーションできるので、役割分担がコード設計上の困難となりそうですが、より規模の大きなプロジェクトでもDRY原則を守りやすくなったと言えるでしょう。Ruby on Railsなどでも実装されています。

Railsは首都圏鉄道網なみに複雑ですけどね! どこを目指しているのでしょうか。翻訳したところしか読み込めてませんので、汲み取れてないだけかもしれません。

ロードマップは遅延気味のようです

マニュアルにロードマップが記載されています。2015年8月に予定が立てられたもので、つぎのようになっています。

  1. フェーズ1:エッセンシャル:2016年6月完了
  2. フェーズ2:コアコンポーネント:2016年12月完了目標
  3. フェーズ3:エキスパンション:2017年4月完了目標

ビューはフェーズ1の扱いですが、ビューパーサのマニュアルは割と最近書かれていたりして、必ずしも完成度を求めたフェーズ分割ではなさそうです。

githubのissuesを見るとフェーズ2っぽい「Pre-Alpha 2」マイルストンが63%の進捗です。記載されていのは一部のタスクだけなので進捗率はもっと高くなると思いますが、あと6日で終わる気はしないですね。延長するか、もしくは「いちおうの区切りをつける」ぐらいの扱いになると思います。

フェーズ3はオプション要素的な扱いなので、ある種のバッファです。期日優先か、完成度優先か、フェーズ3での判断余地を残した形になっています。最高学府たるBCITがこのプロジェクトハンドリングをどうするのか、個人的には見ものです。