Lying的部分服務組件、控制器、AR繼承自`lying\service\Service`,所以并不能定義構造函數(因為在`lying\service\Service`構造函數被定義為`final`),但是你可以重寫`init()`來實現。
只要你的類繼承自`lying\service\Service`,那么你就可以為這個類綁定一些事件,我們先來說一說Lying的一些事件:
[TOC]
### 控制器事件
控制器基類預定義了兩個事件:
~~~php
/**
* @var string 方法執行前事件ID
*/
const EVENT_BEFORE_ACTION = 'beforeAction';
/**
* @var string 方法執行后事件ID
*/
const EVENT_AFTER_ACTION = 'afterAction';
~~~
控制器默認綁定了兩個事件觸發的方法:
~~~php
//$instance是控制器的實例
$instance->on(self::EVENT_BEFORE_ACTION, [$instance, 'beforeAction']);
$instance->on(self::EVENT_AFTER_ACTION, [$instance, 'afterAction']);
~~~
這些事件會在控制器方法執行前和執行后分別進行調用(僅僅在調度器調度控制器的時候有效,手動實例化控制器不會觸發。
默認觸發執行的是當前控制器的`beforeAction()`方法和`afterAction()`方法。當然,如果你想綁定其他事件,你可以在控制器初始化方法里面定義:
~~~php
public function init()
{
$this->on(self::EVENT_BEFORE_ACTION, $callback);
$this->on(self::EVENT_AFTER_ACTION, $callback);
}
~~~
> * 控制器事件所綁定的回調函數可接受一個參數,為`lying\event\ActionEvent`實例:`function (\lying\event\ActionEvent $event)`。
> * 事實上所有的時間回調函數都可接受一個參數,為`lying\service\Event`實例,`function (\lying\service\Event $event)`,`lying\event\ActionEvent`也是繼承自`lying\service\Event`。
你可以在控制器回調事件獲取以下參數:
~~~php
public function beforeAction(\lying\event\ActionEvent $event) {
parent::beforeAction($event);
echo $event->action; //執行的方法名稱
}
public function afterAction(\lying\event\ActionEvent $event) {
parent::afterAction($event);
echo $event->action; //執行的方法名稱
echo $event->response; //執行方法返回的結果
}
~~~
### 數據庫模型事件
如果你的模型繼承了`lying\db\ActiveRecord`,那么你的數據庫模型已經預定義了幾個事件了:
~~~php
/**
* @var string 插入前觸發的事件ID
*/
const EVENT_BEFORE_INSERT = 'beforeInsert';
/**
* @var string 插入后觸發的事件ID
*/
const EVENT_AFTER_INSERT = 'afterInsert';
/**
* @var string 更新前觸發的事件ID
*/
const EVENT_BEFORE_UPDATE = 'beforeUpdate';
/**
* @var string 更新后觸發的事件ID
*/
const EVENT_AFTER_UPDATE = 'afterUpdate';
/**
* @var string 刪除前觸發的事件ID
*/
const EVENT_BEFORE_DELETE = 'beforeDelete';
/**
* @var string 刪除后觸發的事件ID
*/
const EVENT_AFTER_DELETE = 'afterDelete';
/**
* @var string 插入或更新前觸發的事件ID
*/
const EVENT_BEFORE_SAVE = 'beforeSave';
/**
* @var string 插入或更新后觸發的事件ID
*/
const EVENT_AFTER_SAVE = 'afterSave';
~~~
這些事件并沒有像控制器那樣默認綁定了觸發函數,你可以這樣為一個模型實例綁定觸發函數:
~~~php
$user = new User();
$user->on(User::EVENT_BEFORE_INSERT, function(\lying\event\ActiveRecordEvent $event) {
echo $event->rows; //執行后受影響的函數,執行失敗為false
//你想執行的操作
});
~~~
你也可以在模型實例化的時候綁定好事件:
~~~php
<?php
namespace module\index\model;
use lying\db\ActiveRecord;
class UserModel extends ActiveRecord
{
public function init()
{
$this->on(self::EVENT_BEFORE_INSERT, function (\lying\event\ActiveRecordEvent $event) {});
$this->on(self::EVENT_AFTER_INSERT, [$this, 'afterInsert'], '帶入的參數,可以在回調事件獲取');
}
public function afterInsert(\lying\event\ActiveRecordEvent $event)
{
echo $event->data; //獲取到'帶入的參數,可以在回調事件獲取'
}
}
~~~
* `on`的第二個參數為`callable`類型。這些綁定的事件會在實例執行特定的操作的時候觸發,事件可以綁定多個,按綁定順序觸發。
* `on`的第三個參數為`mixed`類型。這個參數可以在回調事件的參數中獲取。
* `on`的第四個參數為`bool`類型。是否插入在事件隊列的末尾,默認true,若果為false則插入到事件處理隊列的首位
> * EVENT_BEFORE_INSERT、EVENT_BEFORE_UPDATE、EVENT_BEFORE_DELETE、EVENT_BEFORE_SAVE事件所綁定的回調函數接收到的參數:`$event->rows`為`null`。
> * EVENT_AFTER_INSERT、EVENT_AFTER_UPDATE、EVENT_AFTER_DELETE、EVENT_AFTER_SAVE事件所綁定的回調函數接受一個參數,為執行結果:`$event->rows`為`int`或者`false`。
### 自定義事件
你可以在已經有的數據庫模型類、控制器類定義其他自定義事件:
1. 定義一個事件ID,但是不能和預定義的事件ID一樣:`const EVENT_EVENTNAME = 'enentId';`。
2. 在要觸發事件的地方寫上事件觸發函數:`$this->trigger($id, $event)`。這里的`$id`就是你定義的事件ID,`$event`就是傳到綁定的方法的參數,為一個`lying\service\Event實例`。
3. 在你需要的地方寫上事件綁定函數`$this->on($id, $callback)`。這里的`$id`就是你定義的事件ID,`$callback`就是你綁定的回調函數。
### 卸載事件
~~~php
$service->off($id, $callback);
~~~
`$service`為`lying\service\Service`的子類實例,`$id`為事件ID,`$callback`就是你要卸載的回調函數。如果`$callback`放空則表示清空整個事件ID所有的回調函數。
### 事件執行順序
> * 事件回調函數的執行順序按照綁定的先后順序執行。
> * 如果有一個事件的函數返回了false或者設置`$event->stop = false;` 則后面的事件就都不再執行
- 序言
- 更新日志
- 安裝
- 規范
- 常量
- 配置
- 自動加載
- MVC
- 模塊
- 控制器
- 模型
- 視圖
- php原生模板
- 模板引擎
- 變量輸出
- 模板注釋
- 模板繼承
- 模板引用
- 流程控制
- 原樣輸出
- 服務組件
- Hook組件
- Request組件
- Router組件
- Cookie組件
- Encrypter組件
- Dispatch組件
- Response組件
- View組件
- Session組件
- Helper組件
- 數據分頁
- 數據驗證
- Logger組件
- Cache組件
- Redis組件
- Connection組件
- 執行sql語句
- 查詢生成器
- 查詢方法詳解
- Schema
- Captcha組件
- CLI
- CLI工具
- 事件
- 類事件
- 實例事件
- 全局事件
- 助手函數
- 擴展
- 異常
- 部署
- Apache
- Nginx
- IIS
- 虛擬主機