CakePHP 4 の MVC の概要と参考 URL まとめ

はじめに

CakePHP には MVC モデル(パターン)が採用されていますが、コンポーネント、ヘルパー、ビヘイビアなど、独特な用語も出てきます。

今日は CakePHP 4.x の MVC モデルについての概要と、公式ドキュメントの参考 URL をまとめます。

参考 URL は日本語ページを記載していますが、もし作業時にうまくいかないときは英語ページを見てみてください。

目次
  1. M (Model)
    1. Entity
    2. Table
    3. Behavior
  2. V (View)
    1. Template
    2. Helper
    3. View
  3. C (Controller)
    1. Controller
    2. Component

1. M (Model)

CakePHP のモデルは EntityTable の2つに分けられていて、
さらに各種 Table から呼び出す関数をまとめた Behavior があります。

1-1. Entity

用途 DB のテーブルにある1行分のデータを扱うもの
場所 src/Model/Entity
src/Controller/BooksController.php
$books = $this->Books->find()->all();
foreach ($books as $book) {
    debug($book); // ← この $book がエンティティ
}

ファイル名が Book.php のように単数形になるのは、1行分のデータを扱うクラスだからですね。

1-2. Table

用途 DB のテーブルを扱うもの。CRUD処理、バリデーションやリレーションの設定などを記述。
場所 src/Model/Table
src/Controller/BooksController.php
// ↓ この $this->Books がテーブル。
$books = $this->Books->find()->all();

1-3. Behavior

用途 各 Table クラスで共通利用したい処理を書く
場所 src/Model/Behavior

公式サイトには「振る舞い」という単語が出てきますが、
基本的には共通利用したいイベント処理を書くと思います。

例えば標準実装されている TimestampBehavior には DB 保存時に created や modified を自動登録する機能があります。

src/Model/Table/BooksTable.php
public function initialize(array $config): void
{
    // ↓ Table クラス内でこのように呼び出す
    $this->addBehavior('Timestamp');

当ブログでは同じく保存時に Markdown を HTML に変換して登録する behavior も紹介しましたね。

2. V (View)

ビューには TemplateHelper、そして View があります。

2-1. Template

用途 HTML など出力内容を記述
場所 templates

CakePHP のテンプレートは基本的には標準の PHP で記述します。
Twig や Blade、Smarty のような独自のタグは組み込まれていません。

2-2. Helper

用途 各テンプレで使用したい共通処理を書く
場所 src/View/Helper

下記はテキストを切り詰める Text ヘルパーの truncate 関数の使用例です。

templates/Books/index.php
<?= $this->Text->truncate($comment, 20) ?>

2-3. View

用途 画面描画に関する共通処理を記述
場所 src/View

View には、例えばテンプレートエンジンに Twig などを使いたい場合や、
PDF として出力する場合などの共通処理を書くことができます。

ヘルパーの読み込みもこの View で制御します。

3. C (Controller)

コントローラは ControllerComponent の2つで構成されています。

3-1. Controller

用途 メインの処理を記述
場所 src/Controller

3-2. Component

用途 各 Controller で使用する共通処理を書く
場所 src/Controller/Component

設計なしで作り始める場合は Controller に処理を書いていくと思いますが、開発が進んでくると同様の処理を繰り返し書く場合があります。

時々 Controller を見直して、Component に関数として実装できないか検討することで、保守性が高いコードが書けるようになるのでおススメです。