あなたのお気に入りのフレームワークCodeIgniterが帰ってきた!(CodeIgniter 3.0の感想) post

すでにご存じの人も多いと思いますが、2015年3月30日にCodeIgniter 3.0.0がリリースされました。

その影響もあり、日本語の情報も徐々に増えてきてます。そこで、私もこのあたりで現在の感想を書いておこうと思います。

(参考)PHPカンファレンス福岡でのCodeIgniterについて発表資料

ライセンスがMITライセンスに変更

何と言っても最大の変更点はライセンスが変わったことです。

2.xまでは独自ライセンスのCodeIgniterライセンス(GPL非互換)だったものが、3.0からはMITライセンスになりました。

これは、CodeIgniterのオーナーが私企業のEllisLabから、大学であるBCITに変わったことにより実現しました。

EllisLabにより3.0のライセンスはOSL 3.0にという聞いたこともないようなマイナーなものに変更される予定だったのですが、結果として多くのユーザが望むよりポピュラーなMITライセンスになりました。

詳しい経緯について興味がある人は以下をご覧ください。

EllisLabの突然のライセンス変更宣言から、CodeIgniterライセンスのGPL非互換宣言、そして、高飛車にオープンソースライセンスの解説を始めたことなどにより、非常に反感を覚えたユーザもいたことと思います。

しかし、オーナーがアカデミックなBCITに変わり、即座にMITライセンスへの変更が決定されるなど、CodeIgniterにまとわりついていたEllisLabに関連するネガティブな感情も完全に払拭されました。

新しいオーナーによる新しいCodeIgniter、それが3.0です。

ライセンス問題からCodeIgniterの身売りへと長く続いたネガティブな雰囲気は完全に解消されました。

BCITおよびそのプロジェクトリードのjlp、そして、CodeIgniterをうまく処理したEllisLabにも敬意を表したいと思います。

APIの変更点は少なく移行コストは低い

新しいCodeIgniterですが、2.xからの変更点はそんなに多くありません。移行コストは低いです。すべての1.x、2.xユーザに3.0への移行をお薦めします。

何と言ってもMITライセンスですからね。もうオレオレオープンソースではありません。OSI認証のオープンソースライセンスです。

私も『CodeIgniter徹底入門』のサンプルアプリ(CodeIgniter 1.6.1用)をアップグレードしてみましたが、アップグレードだけなら1日も掛かりませんでした。

変更点の詳細はユーザガイドに細かく記述されていますので、アップグレードの際は必ず確認しましょう。

なお、クラスファイルのファイル名は先頭が大文字と規約で定められました。クラスファイルだけで、ビューや設定ファイルは小文字です。

これについては、チェッカーを作成しました。

Composer対応

また、個人的に次に重要な変更点が、Composer対応したことです。Composerの利用はオプションで、使いたい場合は設定ファイルで設定します。

これにより、Composerのパッケージが自由に使えますし、Composerのオートローダも使えます。

また、CodeIgniter本体のComposerからのインストールやアップグレードも可能になりました。

クセが減った

もともとCodeIgniterは1.x時代に$_GETがセキュリティ上の理由から使えないみたいな独自の仕様がいくつかありました。

クエリ文字列は改竄しやすく、また、漏れやすいですし、セキュリティ上のリスクが$_POSTなどと比較して若干高いというリスク分析は可能だとは思います。

しかし、だからと言って$_GETをフレームワークがクリアしてしまい一切使えないというのは不便すぎるというべきでしょう。HTTP的にもGETメソッドでクエリ文字列で渡す場合とPOSTメソッドで渡す場合は意味が異なりますし。

この仕様は2.0で変更され、$_GETも使えるようになっています。

このような独自だった点や仕様的に疑問のあった点が3.0でも改善されています。

詳しい理由は知りませんが、セッションの実装が完全に書き直され、セッションデータはデフォルトでファイルベースになり、$_SESSIONも使えるようになりました。

また、XSSフィルタを入力フィルタとして使うべきでないことがユーザガイドに明記されました。

それから、データベースの操作で「Active Record」と呼ばれていたものは、より適切な名称である「Query Builder」に改名されました。

実はそんなに難しくないCodeIgniterでのテスト

標準のユニットテストクラスが少々機能不足である点は3.0でも変更はありません。

また、CodeIgniter本体のテストはPHPUnitにより進んでおりカバー率も向上していますが、アプリのPHPUnitでのテストについては3.0がリリースされても進展は全くありませんでした。

PHPUnitでのテストが簡単に書けないのはさすがに困りますので、ゼロからブリッジツールを書くことにしました。

これで、CodeIgniterでもPHPUnitで簡単にテストを書くことができるようになりました。テストカバー率100%も必要であれば達成できます(アプリのコードがきれいならば)。

実はCodeIgniterはもともと構造的にDependency(依存オブジェクト)を簡単に交換可能になっています。ロードしたモデルやライブラリは、CodeIgniterスーパーオブジェクトのプロパティに動的に追加され、それらはpublicなプロパティですから、外部から簡単に注入できます。

必要な依存オブジェクトをモックで置き換えてしまえばユニットテストも可能です。

問題点

問題点についても書いておきます。

基本的な設計は1.xの時代から変わっていません。その意味でCodeIgniterがレガシーであること、あまりかっちりとしたOOPではないことは確かです。

また、3.0でもPHP 5.2.4以上という要件(ただし、PHP 5.4以上を推奨)なので、CodeIgniter本体では最新のPHPの機能を使うことはできません。

しかし、ユーザの作成するアプリでは最新のPHPの機能を使うかどうかはユーザの自由なので、実際に問題になるところはほとんどないと思います。

私が考える最大の問題点は、コントローラに名前空間が使えないことです。これだけは、CodeIgniter本体に手を入れないと今のところ無理です。

(2016/07/03追記) https://github.com/kenjis/codeigniter3-namespaced-controller にてCodeIgniter 3.0での名前空間付きのコントローラのサポートの開発を始めました。

あとは、どうしてもDIコンテナをアプリ全体に使いたいという場合、これもCodeIgniter本体に手を入れないと無理です。

ただし、これらが本当に問題となるような状況はあまりないように思います。

まとめ

CodeIgniter 3.0は大きな変更はありませんが、いろいろな点で着実によくなっており、使い勝手は以前のバージョンと変わりません。

過去にCodeIgniterを使ったことがある人であれば、すぐに移行でき慣れるでしょう。

規約もすごく少ないので初心者でも簡単に使い始めることができ、また、自由に自分で組み立てて使っていくフレームワークなので、余計なものはありませんし、よくわからない黒魔術みたいなものもなく、理解もしやすいでしょう。

現在、名前空間を知らなくても使うことができる唯一のメジャーなフレームワークではないかと思います。

また、Composerに対応したことにより、パッケージ(ライブラリ)を組み合わせていくというモダンな開発にも対応可能です。

テンプレートはTwigで、ORMはDoctrineでという今どきの構成も可能です(まあ、2.xでもできたのでしょうが)。

パフォーマンスも2.xとたぶんほぼ変わらないと思います。Hello Worldベンチマークでは今でもPHPで実装されたフレームワークでは最速の部類に属します。重量級であるSymfonyやLaravelの7〜10倍の数値が出ています。

これ以上のパフォーマンスが必要な場合は、PhalconなどのCで実装されたフレームワークを使う必要があるでしょう。

CodeIgniter 3.0は、あなたのお気に入りのフレームワークCodeIgniterが本当のオープンソースとして復活したという記念すべきバージョンでしょう。

私はこのおかげで「resurrection」という単語を覚えました。

関連

Date: 2015/07/09

Tags: codeigniter