# 事件處理
### 基本用法
> **注意:**有關OctoberCMS本身可用的所有事件的列表,請參閱[api文檔](https://octobercms.com/docs/api/translator/beforeresolve)。
本`Event`類提供了一個簡單的觀察器實現,允許您訂閱和聆聽您的應用程序事件。例如,您可以偵聽用戶何時登錄并更新其上次登錄日期。
~~~
Event::listen('auth.login', function($user) {
$user->last_login = new DateTime;
$user->save();
});
~~~
該事件可以通過`Event::fire`稱為用戶登錄邏輯一部分的方法使該事件可用,從而使邏輯可擴展。
~~~
Event::fire('auth.login', [$user]);
~~~
### [](https://octobercms.com/docs/services/events#events-subscribing)訂閱事件
該`Event::listen`方法主要用于預訂事件,可以在應用程序代碼中的任何位置進行。第一個參數是事件名稱。
~~~
Event::listen('acme.blog.myevent', ...);
~~~
第二個參數可以是一個閉包,它指定觸發事件時應發生的情況。閉包可以接受由[fireing事件](https://octobercms.com/docs/services/events#events-firing)提供的一些可選參數。
~~~
Event::listen('acme.blog.myevent', function($arg1, $arg2) {
// Do something
});
~~~
您也可以傳遞對任何可調用對象或[專用事件類](https://octobercms.com/docs/services/events#using-classes-as-listeners)的引用,并將其代替使用。
~~~
Event::listen('auth.login', [$this, 'LoginHandler']);
~~~
> **注意**:可調用方法可以選擇指定所有,部分或不指定任何參數。無論哪種方式,事件都不會拋出任何錯誤,除非它指定了太多錯誤。
### [](https://octobercms.com/docs/services/events#event-registration)在哪里注冊聽眾
最常見的地方是[插件注冊文件](https://octobercms.com/docs/plugin/registration#registration-methods)的`boot`方法。[](https://octobercms.com/docs/plugin/registration#registration-methods)
~~~
class Plugin extends PluginBase
{
[...]
public function boot()
{
Event::listen(...);
}
}
~~~
另外,插件可以在插件目錄中提供一個名為**init.php**的文件,您可以使用該文件放置事件注冊邏輯。例如:
~~~
<?php
Event::listen(...);
~~~
由于這些方法都不是天生的“正確”方法,因此請根據應用程序的大小來選擇適合的方法。
### [](https://octobercms.com/docs/services/events#subscribing-priority)使用優先級訂閱
訂閱事件時,您也可以將優先級指定為第三個參數。具有較高優先級的偵聽器將首先運行,而具有相同優先級的偵聽器將按訂閱順序運行。
~~~
// Run first
Event::listen('auth.login', function() { ... }, 10);
// Run second
Event::listen('auth.login', function() { ... }, 5);
~~~
### [](https://octobercms.com/docs/services/events#subscribing-halting)停止事件
有時您可能希望停止將事件傳播到其他偵聽器。您可以通過`false`從偵聽器返回來使用:
~~~
Event::listen('auth.login', function($event) {
// Handle the event
return false;
});
~~~
### [](https://octobercms.com/docs/services/events#wildcard-listeners)通配符偵聽器
注冊事件偵聽器時,可以使用星號指定通配符偵聽器。通配符偵聽器將首先接收觸發的事件名稱,然后接收作為數組傳遞給事件的參數。
以下偵聽器將處理以開頭的所有事件`foo.`。
~~~
Event::listen('foo.*', function($event, $params) {
// Handle the event...
});
~~~
您可以使用該`Event::firing`方法來確切確定觸發了哪個事件:
~~~
Event::listen('foo.*', function($event, $params) {
if (Event::firing() === 'foo.bar') {
// ...
}
});
~~~
### [](https://octobercms.com/docs/services/events#events-firing)射擊事件
您可以`Event::fire`在代碼中的任何位置使用該方法以使邏輯可擴展。這意味著其他開發人員,甚至您自己的內部代碼,都可以“鉤住”這一點代碼,并注入特定的邏輯。的第一個參數應為事件名稱。
~~~
Event::fire('myevent')
~~~
在插件名稱空間代碼前添加事件名稱總是一個好主意,這樣可以防止與其他插件發生沖突。
~~~
Event::fire('acme.blog.myevent');
~~~
第二個參數是一個值數組,這些值將作為參數傳遞給預訂[該事件的偵聽器](https://octobercms.com/docs/services/events#events-subscribing)。
~~~
Event::fire('acme.blog.myevent', [$arg1, $arg2]);
~~~
第三個參數指定事件是否應為[暫停事件](https://octobercms.com/docs/services/events#subscribing-halting),這意味著如果返回“非null”值,則該事件應[停止](https://octobercms.com/docs/services/events#subscribing-halting)。默認情況下,此參數設置為false。
~~~
Event::fire('acme.blog.myevent', [...], true);
~~~
如果事件停止,則將捕獲返回的第一個值。
~~~
// Single result, event halted
$result = Event::fire('acme.blog.myevent', [...], true);
~~~
否則,它將以數組的形式返回所有事件的所有響應的集合。
~~~
// Multiple results, all events fired
$results = Event::fire('acme.blog.myevent', [...]);
~~~
### [](https://octobercms.com/docs/services/events#event-pass-by-reference)通過引用傳遞參數
在處理或過濾傳遞給事件的值時,可以給變量加上前綴`&`以通過引用傳遞它。這使多個偵聽器可以操縱結果并將其傳遞給下一個。
~~~
Event::fire('cms.processContent', [&$content]);
~~~
在偵聽事件時,還需要`&`在閉包定義中使用符號聲明參數。在下面的示例中,`$content`變量將在結果后附加“ AB”。
~~~
Event::listen('cms.processContent', function (&$content) {
$content = $content . 'A';
});
Event::listen('cms.processContent', function (&$content) {
$content = $content . 'B';
});
~~~
### [](https://octobercms.com/docs/services/events#queued-events)排隊事件
觸發事件可以[與隊列一起](https://octobercms.com/docs/services/queues)推遲。使用此`Event::queue`方法可以“排隊”要觸發的事件,但不能立即將其觸發。
~~~
Event::queue('foo', [$user]);
~~~
您可以使用該`Event::flush`方法刷新所有排隊的事件。
~~~
Event::flush('foo');
~~~
### [](https://octobercms.com/docs/services/events#using-classes-as-listeners)使用類作為偵聽器
在某些情況下,您可能希望使用類來處理事件,而不是使用Closure。類事件偵聽器將在[Application IoC容器之外](https://octobercms.com/docs/services/application)進行解析,從而為您提供對偵聽器的依賴項注入的全部功能。
### [](https://octobercms.com/docs/services/events#event-class-method)訂閱個別方法
事件類可以`Event::listen`像其他方法一樣注冊,將類名作為字符串傳遞。
~~~
Event::listen('auth.login', 'LoginHandler');
~~~
默認情況下,該類`handle`上的方法`LoginHandler`將被調用:
~~~
class LoginHandler
{
public function handle($data)
{
// ...
}
}
~~~
如果您不希望使用默認`handle`方法,則可以指定應訂閱的方法名稱。
~~~
Event::listen('auth.login', 'LoginHandler@onLogin');
~~~
### [](https://octobercms.com/docs/services/events#event-class-subscribe)訂閱整個課程
事件訂閱者是可以從類本身內部預訂多個事件的類。訂戶應定義一個`subscribe`方法,該方法將傳遞給事件分派器實例。
~~~
class UserEventHandler
{
/**
* Handle user login events.
*/
public function userLogin($event)
{
// ...
}
/**
* Handle user logout events.
*/
public function userLogout($event)
{
// ...
}
/**
* Register the listeners for the subscriber.
*
* @param Illuminate\Events\Dispatcher $events
* @return array
*/
public function subscribe($events)
{
$events->listen('auth.login', 'UserEventHandler@userLogin');
$events->listen('auth.logout', 'UserEventHandler@userLogout');
}
}
~~~
一旦定義了訂戶,就可以向該`Event::subscribe`方法注冊。
~~~
Event::subscribe(new UserEventHandler);
~~~
您也可以使用[Application IoC容器](https://octobercms.com/docs/services/application)解析您的訂戶。為此,只需將您的訂戶名稱傳遞給該`subscribe`方法。
~~~
Event::subscribe('UserEventHandler');
~~~
### [](https://octobercms.com/docs/services/events#event-emitter-trait)事件發射器特征
有時您想將事件綁定到對象的單個實例。您可以通過`October\Rain\Support\Traits\Emitter`在類內部實現特征來使用備用事件系統。
~~~
class UserManager
{
use \October\Rain\Support\Traits\Emitter;
}
~~~
此特征提供了一種使用偵聽事件的方法`bindEvent`。
~~~
$manager = new UserManager;
$manager->bindEvent('user.beforeRegister', function($user) {
// Check if the $user is a spammer
});
~~~
該`fireEvent`方法用于引發事件。
~~~
$manager = new UserManager;
$manager->fireEvent('user.beforeRegister', [$user]);
~~~
這些事件將僅在本地對象上發生,而不是全局上。
- 基本說明
- 基本操作
- October cms 安裝
- 后臺控制器路徑
- 圖標
- 獲取安裝網上的插件/主題
- 插件構造器使用
- 定時任務
- October后臺控制器
- vscode編輯器
- ajax操作
- 使用
- ajax更新組件
- ajax屬性API
- JavaScript API
- ajax綜合使用
- 主題
- 多語言主題
- 安裝市場主題
- 主題程序處理
- 主題
- 頁面
- 部件
- 布局
- 內容
- 組件
- 媒體
- 主題表單操作
- 表單使用
- 表單后端程序處理
- 插件
- 自定義插件
- 插件說明
- 插件導航條
- 插件數據庫設置
- 插件的設置管理
- 插件的配置文件config
- 組件
- app服務
- app容器
- 擴展行為
- 緩存
- Collection類
- Lazy Collections
- Collection方法
- 助手函數
- 數組助手函數
- 路徑助手函數
- 玄樂助手函數
- 其他助手函數
- 錯誤與記錄
- 事件處理
- HTML頁面
- 文件與目錄操作
- 散列和加密
- 郵件
- 郵件內容
- 郵件發送
- 分頁
- 模板解析器
- 動態解析器語法
- 隊列消息
- 請求與輸入
- 響應
- 視圖
- 路由器
- 配置
- 驗證操作
- 處理錯誤消息
- 錯誤消息與視圖
- 可用的驗證規則
- 有條件的驗證規則
- 驗證數組
- 錯誤消息
- 自定義驗證規則
- 模型操作
- 定義模型與其屬性
- 檢索模型
- 插入與更新
- 刪除模型
- 查詢范圍
- 事件操作
- 關聯操作
- 定義關系
- 關系類型
- 多肽關系
- 關系查詢
- 渴望加載
- 插入模型
- 數據庫操作
- 基本用法
- 數據表結構
- 查詢連貫操作
- 結果檢索
- select子句
- 插入更新
- where子句
- 排序,分組,限制和偏移
- 文件附件
- Collection操作
- 屬性操作
- 系列化json
- 數據庫屬性
- 數據庫行為
- 控制器
- 后臺控制器定義
- 后臺頁面
- 后臺組件
- 后臺表單
- 表單組件
- 表單視圖
- 表單行為
- 后臺列表
- 列表行為
- 列表過濾器
- 可用列類型
- 關系行為
- 關系行為類型
- 擴展關系行為
- 列表排序操作
- 導入導出操作
- 用于與權限
- corlate模板修改
- 修改頂部導航
- laravel問題
- 控制器不存在
- 控制器
- 路由組
- laravel筆記
- laravel 安裝
- 偽靜態配置
- 依賴注入 & 控制器
- 中間件
- 路由文件
- 視圖