Phalcon Model まとめ(5) ビヘイビア

「最速」PHPフレームワークPhalconのモデルについて、基本事項をまとめます(公式ドキュメントの翻訳+αです)。記事執筆時のPhalconのバージョンは1.3.1です。

ビヘイビア

ビヘイビアとは、複数のモデルに共有される振る舞いのことです。PhalconのORマッパーは、モデルでビヘイビアを実装するためのAPIを提供しています。また、イベントとコールバックを使用して、より自由度の高いビヘイビアを実装することもできます。

ビヘイビアは、モデルの初期化処理に加えなければなりません。モデルは複数のビヘイビアをもつことができます。

フレームワークは、以下の組み込みビヘイビアを提供しています。

名前 説明
Timestampable レコードが作成・更新される際に、自動的にモデルのフィールドを更新する
SoftDelete 永続的な削除(物理削除)の代わりに、削除フラグを付与する(論理削除)

Timestampable

このビヘイビアは、配列をオプションとして受け取ります。最初のキーが、カラムへの代入が行われるイベント名になります。

それぞれのイベントには独自のオプションがあり、fieldは更新されるカラム名になります。formatが文字列なら、PHPのdate()関数の引数として渡されます。formatには無名関数を使うこともでき、お好みの形式でタイムスタンプを作ることができます。

formatがオプションの配列に含まれない場合は、タイムスタンプはPHPのtime()関数を使用し、タイムスタンプの数値が代入されます。

SoftDelete

このビヘイビアは、以下のように使います。

このビヘイビアは、2つのオプションを受け取ります。fieldは更新されるフィールド名を、valueは削除フラグの値を指定します。以下のようなデータをもつusersテーブルについて考えてみます。

もし、いずれかのレコードを削除したら、レコードが削除される代わりに、statusが更新されます。

上記コードが実行されると、テーブルの中のデータは以下のようになります。

削除済みか否かのフラグをクエリで明示的に指定してやる必要がある点に注意してください。テーブルが上の状態の時、以下のコードを実行すると、削除されたはずのBrandonも取得されてしまいます。

論理削除済みのレコードを除外するには、以下のようにします。

独自のビヘイビアを作る

ORマッパーは、独自のビヘイビアのためのAPIを提供しています。ビヘイビアは、PhalconMvcModelBehaviorInterfaceを実装したクラスでなければなりません。また、PhaconMvcModelBehaviorが、ビヘイビアの実装に必要なほとんどのメソッドを提供しています。

以下のビヘイビアは、1つの実装例です。Blamableビヘイビアは、ユーザーがモデルに行った操作を特定します。

次に、このビヘイビアをモデルに追加してみます。

ビヘイビアは、不明なメソッド呼び出しに対して割り込みができます。

Sluggableを実装しているモデルにgetSlug()メソッドの呼び出しを行うと、SEO対策のされたtitleが返ります。

トレイトをビヘイビアとして使う

PHP5.4以降では、トレイトを使うことでクラスのコードの再利用ができます。この機能を使って、独自のビヘイビアを実装することもできます。以下のトレイトは、TimeStampableビヘイビアのシンプルな実装例です。

モデルでは、以下のようにして利用します。

今回はここまで

今回は、Phalconのモデルで利用可能なビヘイビアについて紹介しました。次回は、Transactionsから先をみていきます。

コメントを残す