はじめに
このページは、CakePHP 2 のアプリケーションをすでに運用している方と、モダンな PHP の経験があって CakePHP 2 のアプリケーションを担当することになった開発者に向けた、このドキュメントの入口です。 このフォークで何が違うのか、詳しくはどこを読めばよいのかをまとめています。 CakePHP 2 を初めて使う場合は、ブログチュートリアル で 小さなアプリケーションを順を追って作ることができます。
このフォークについて
このドキュメントは、CakePHP 2.x のコミュニティによるフォーク pieceofcake2/cakephp について説明しています。このフォークは CakePHP 2.10.24 をベースにしており、PHP 8.0 から 8.5 で動作します。 保守を目的としたフォークで、CakePHP 2 を現在の PHP に対応させ、バグとセキュリティの問題を修正します。 機能の追加は目的としておらず、追加するのは CakePHP 5 からのバックポートなど、保守と移行に役立つものに限っています。
CakePHP プロジェクトによる CakePHP 2.x のサポートは 2021年6月に終了しました。
このクックブックは、フォーク上で動く CakePHP 2 に合わせて、Composer でのインストール、PHP 8、 pieceofcake2/app で使っているモダンなディレクトリ構成を前提に説明しています。 本家の CakePHP 2.x のドキュメントとの違いは 本家ドキュメントからの変更点 にまとめています。フォークのほかのプロジェクトやリソースは Piece of Cake 2 のサイト から参照できます。
CakePHP 2.10 との違い
CakePHP 2.10 を知っていれば、その知識のほとんどはそのまま使えます。モデル、コントローラ、ビュー、 コンポーネント、ビヘイビア、ヘルパーはこれまでどおりに動作します。変わったのは次の点です。
- Composer のみ。
pieceofcake2/cakephpを Composer でインストールします。アーカイブ、PEAR、include_pathによるインストールは無くなりました。このパッケージはcakephp/cakephpを置き換える (replace する) ので、cakephp/cakephp2.x に依存するプラグインもそのままインストールできます。 フレームワークはvendor/pieceofcake2/cakephp/src/Cake/(以前はlib/Cake/) にあり、 クラスはApp::uses()ではなく Composer のクラスマップで読み込まれます。 インストール と クラスの読み込み を参照してください。 - PHP 8。 PHP 8.0 から 8.5 で動作します。現在の PHP で動作しない API はいくつか削除されました。 たとえば
Stringクラス (CakeTextを使ってください) や、Xcache と Wincache のキャッシュエンジンです。 CakePHP 2.10 からの移行 を参照してください。 - モダンなディレクトリ構成。 アプリケーションは CakePHP 5 と同じ構成 (
bin/cake、config/、src/、templates/、tests/、plugins/) を使えます。従来のapp/構成も引き続き動作します。 このドキュメントはモダンな構成で説明しています。 CakePHP のフォルダ構造 を参照してください。 - PHPUnit 9.6。 テストは PHPUnit 3.7 ではなく 9.6 で実行します。テスト と PHPUnit 9.6 への移行 を参照してください。
- コーディング規約。 フォークのコードとこのドキュメントのサンプルは、CakePHP 5 の codesniffer の ルール (スペース 4 つのインデント、短い配列構文) に従っています。 コーディング規約 を参照してください。
- 静的解析。 pieceofcake2/phpstan-cakephp2 拡張を使うと、PHPStan がモデル、コンポーネント、ビヘイビアを理解できるようになります。 静的解析 を参照してください。
- セキュリティ修正。 CakePHP 2.10.24 の既知の脆弱性を修正しています。たとえば CSRF トークンは HMAC で署名されるようになりました。脆弱性への対応 を参照してください。
- CakePHP 5 からのバックポート。
IntegrationTestTraitとEmailTrait(CakePHP 2.12.4) を使うと、 実際のディスパッチャを通してコントローラを CakePHP 5 と同じメソッド名でテストできます。 統合テスト を参照してください。アプリケーションスケルトンは.envファイルを読み込みます (pieceofcake2/app 2.4.0)。 環境変数 を参照してください。 - Bake とプラグイン。 Bake とアップグレード用のシェルはコアからプラグインに移りました。 また、主要な CakePHP 2 のプラグインも PHP 8 対応版がメンテナンスされています。 Bakeでコード生成 と メンテナンスされているプラグイン を参照してください。
どこから始めるか
既存のアプリケーション
このドキュメントの読者の多くは、CakePHP 2 で動いているアプリケーションを保守しています。
- CakePHP 2.10 からの移行 で前提条件と互換性のない 変更点を確認します。フォークは CakePHP 2.10.24 をベースにしているので、それより古い 2.x の アプリケーションは先に 2.10.24 にアップグレードしてください。
- 既存のアプリケーションへの導入 のとおりに、
cakephp/cakephpをpieceofcake2/cakephpに置き換え、ディスパッチャファイルを更新します。 - 必要であれば、モダン構成への移行 のとおりに、 ディレクトリ単位で少しずつモダンな構成に移行します。この作業は、将来 CakePHP 5 に移行するための 準備にもなります。
新しいアプリケーション
フォークで新しくアプリケーションを始めるときは、アプリケーションスケルトンから作成します。
composer create-project pieceofcake2/app my_appその後の設定は 新しいアプリケーションの作成 を参照してください。
NOTE
新しいプロジェクトでは、まず CakePHP 5 を検討してください。 このフォークは、CakePHP 2 のまま運用する必要があるアプリケーションのためのものです。
モダンな PHP から来た方へ
CakePHP 2 は PHP 5.2 と 5.3 の時代に設計されました。CakePHP 5、Laravel、Symfony などに慣れている場合は、 次の違いに注意してください。
- 名前空間がありません。 フレームワークとアプリケーションのクラスはグローバルなクラスで、 クラス名とファイルの場所は 規約 で決まります。たとえば
PostsControllerはsrc/Controller/PostsController.phpに置きます。 フォークでは Composer のクラスマップがこれらを読み込みます。App::uses()が必要なのは、 多くのプラグインのクラスのように、Composer が知らないクラスだけです。 - オブジェクトではなく配列。
find()はオプションを配列で受け取り、$post['Post']['title']のように モデルのエイリアスをキーにした入れ子の配列を返します。エンティティやコレクションではありません。 データを取得する を参照してください。フォームのデータ、 バリデーションルール、コンポーネントの設定も配列です。 - モデルはテーブルゲートウェイです。 テーブルごとに 1 つの
Modelクラスが、検索、保存、 バリデーション、アソシエーションを扱います。再利用するロジックは、モデルならビヘイビア、 コントローラならコンポーネント、ビューならヘルパーにまとめます。 CakePHP の構造 を参照してください。 - 依存性注入ではなく規約による結び付け。 サービスコンテナはありません。コントローラは
$uses、$components、$helpersなどのプロパティで使うものを宣言し、$this->Post、$this->Auth、$this->Htmlとしてアクセスします。 - グローバルな設定。 設定は静的なレジストリ Configure に置き、
Configure::read('App.encoding')のように読み出します。キャッシュとログもCache::config()、CakeLog::config()という同じ形の静的メソッドで設定します。 - PSR-7 もミドルウェアもありません。 リクエストとレスポンスは
CakeRequestとCakeResponseオブジェクトで、ディスパッチャの前後で動かす処理は ディスパッチャー・フィルター として書きます。 - ネイティブな型宣言はわずかです。 コアのメソッドのほとんどは引数や戻り値の型宣言を持ちません。 docblock と 静的解析 で補ってください。
これらの要素がどのように連携するかは CakePHP の典型的なリクエスト で説明しています。
