スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Yiiで、ビヘイビアを使ってみる

簡単な説明

ビヘイビアっていうのは、PHPだとmixinと同義に扱われている。
CakePHPなんかでもほとんどおんなじ機能があって、要するに「クラスを継承しないで、メソッドを実装したい」
もしくは「PHPでも多重継承をしたい」っていう場合に使う機能のこと。

超簡単なサンプル

まあ、百聞は一見にしかず。簡単なサンプル。作るファイルは二つ

まずはBehaviorそのもの
protected/components/ExampleBehavior.php
<?php

class ExampleBehavior extends CBehavior{
  public function hoge(){
    echo "hoge";
  }
}
?>
次はこいつを使うクラス。今回は簡単のためコントローラ
protected/controllers/HogeController.php

class HogeController Extends CController {
  // CComponentの子クラスでは、behaviors()メソッドをオーバーライドすることで、
  // ビヘイビアの実装が可能
  public function behaviors(){
    return array(
      'hoge' => array(
        'class' => 'application.components.ExampleBehavior',
      ),
    );
  }

  public function actionIndex(){
    // このクラスはhoge()メソッドを持っていないにもかかわらず、
    // ビヘイビアクラスから継承したかのように実行できる
    $this->hoge();
  }
}

このコントローラにアクセスしてみると、

hoge

と表示される。

具体的な使用例

実際にはCActiveRecordBehaviorを継承して使うことが圧倒的に多いんじゃないんだろうか。
実は自分もこの使い方しかしたことがない。

CActiveRecordBehaviorを継承して、以下のメソッドをオーバーライドすることで、モデルの処理とかにいろんな悪さが出来る。

beforeSave() / afterSave() → save()の前後。afterSaveが一番使うかも
beforeValidate() / afterValidate() → バリデーションの前後。入力データを書き換えたりするならここかも
beforeFind() / afterFind() → find()の前後

具体的な実装例はzii.behaviors.CTimestampBehaviorがいいかも。
これをbehaviors()メソッドをオーバーライドして実装すると、create_timeという列に作成日時を、update_timeという列に更新日時を勝手に設定してくれる。

使用例はいくらでも考えられるだろうけれど

afterSave()を使って、データを更新したときに、更新ログを残す
バリデーションされるたびに、エラーになったデータを別のテーブルに記録する

など色々考えられると思う。
スポンサーサイト

コメントの投稿

非公開コメント

承認待ちコメント

このコメントは管理者の承認待ちです
プロフィール

takakino

Author:takakino
長いことPHPとかJavaとか、その昔はPerlとか。Webのシステム屋をずーっとやってきました。
最近Scalaにはまっています。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
Yii (5)
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
Twitter
Twitterこそこそやってます
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。