Yii 中幾乎所有可實例化並繼承自 CComponent 的類別均稱為組件。從 CApplication、控制器、URL 管理器到各類插件,皆以組件形式存在,賦予框架高度彈性與擴充性。
CComponent(直接或間接)透過魔術方法實現虛擬屬性,允許定義 setXxx()、getXxx() 方法來攔截屬性讀寫,進行驗證或轉換。
class Webpage extends CComponent {
public $title;
private $_url;
public function setUrl($value='') {
if (filter_var($value, FILTER_VALIDATE_URL)) {
$this->_url = $value;
}
}
public function getUrl() { return $this->_url; }
}
$page = new Webpage();
$page->title = "page title";
$page->url = "/index.php"; // 呼叫 setUrl()
echo $page->url; // 呼叫 getUrl()
定義 onXxx() 方法即宣告事件,內部呼叫 raiseEvent() 通知所有綁定的處理器。
class Form extends CComponent {
public function onSubmit($event) {
$this->raiseEvent('onSubmit', $event);
}
}
$form = new Form();
$form->attachEventHandler('onSubmit', [$logObject, 'saveLog']);
// 或使用 setter 綁定
$form->onSubmit = [$logObject, 'saveLog'];
// 觸發事件
$form->onSubmit(new CEvent($form, ['data' => $_POST]));
同一事件可綁定多個處理器,類似 JavaScript addEventListener。
行為類別繼承 CBehavior,定義 events() 回傳事件對應方法陣列。組件透過 attachBehavior() 掛載行為,即可直接呼叫行為的方法與屬性。
class MyAppBehavior extends CBehavior {
public $status = "app behavior ended.";
public function events() {
return ['onEndRequest' => 'appEnd'];
}
public function appEnd($event=null) { echo get_class($this); }
}
$app->attachBehavior('myapp', 'MyAppBehavior');
$app->run();
echo $app->status; // 可直接存取行為屬性