我的理解是:Behavior的目的就是重用。
當把一個Behavior加入到Component後,這個Component就有了這個Behavior的方法、屬性、事件。
但是我還是搞不清楚什麼時候要使用Behavior,各位大神能不能舉個例子,什麼時候將代碼放在Behaviors裡面?
附上My Code:
'sayHello' ));}public function sayHello(){ echo 'hello world!!!';}}?>
getName();// }// public function actionEvent(){// $com=Yii::createComponent('application.components.TestComponent');// $com->onClick=array($this,'sayHello');//調用了一個不存在屬性,會使用魔術方法// $com->onClick(new CEvent($com));// }public function actionBehavior(){ $com=Yii::createComponent('application.components.TestComponent'); $com->attachBehavior('test','ext.behaviors.TestBehavior');$com->sayHello();$com->onClick(new CEvent($com)); //behavior 中的seyHello綁定了onClick。調用onClick就會調用sayHello()}// public function sayHello(){// header('Content-type:text/html;charset=utf-8');// echo 'hello world';// }}?>
回複內容:
我的理解是:Behavior的目的就是重用。
當把一個Behavior加入到Component後,這個Component就有了這個Behavior的方法、屬性、事件。
但是我還是搞不清楚什麼時候要使用Behavior,各位大神能不能舉個例子,什麼時候將代碼放在Behaviors裡面?
附上My Code:
'sayHello' ));}public function sayHello(){ echo 'hello world!!!';}}?>
getName();// }// public function actionEvent(){// $com=Yii::createComponent('application.components.TestComponent');// $com->onClick=array($this,'sayHello');//調用了一個不存在屬性,會使用魔術方法// $com->onClick(new CEvent($com));// }public function actionBehavior(){ $com=Yii::createComponent('application.components.TestComponent'); $com->attachBehavior('test','ext.behaviors.TestBehavior');$com->sayHello();$com->onClick(new CEvent($com)); //behavior 中的seyHello綁定了onClick。調用onClick就會調用sayHello()}// public function sayHello(){// header('Content-type:text/html;charset=utf-8');// echo 'hello world';// }}?>
Behavior翻譯成行為,行為即是方法。也就說說在Yii中,可以隨意給類(必須是CComponent子類)添加類本身不存在的方法或新的方法,兩個例子:
- CTimestampBehavior 這個Behavior是通過覆蓋CActiveRecord的beforeSave方法來實現自動填滿添加/修改時間。
- 在使用Yii上傳類CUploadedFile的時候可能會遇到這樣的問題:公司有自己的儲存服務,那麼CUploadedFile內建的儲存到本地方法就不能用了。那麼通過給CUploadedFile類添加一個Behavior類,在這個Behavior類裡寫合適當前環境的上傳方式,調用的時候直接正常調用Behavior裡的類,這個過程和調用CUploadedFile中的類沒什麼兩樣。
其實我用了很久也基本沒接觸過自己去寫behavior,唯一用到的就是http://www.yiiframework.com/doc/api/1.1/CTimestampBehavior這個內建的behavior,來自動儲存Model時間相關欄位。因為平時滿足需求就用懶得方法,沒去想利用這個。