<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### 2019 年 4 月 21 日 發布 在最新的`6.0`版本中引入了新的事件系統用以替代`5.1`版本的行為,同時也接管了數據庫事件和模型事件。 本篇主要描述下新版的事件系統以及查詢事件、模型事件的使用。 ## 定義事件 >[danger] 事件系統的所有操作都通過`think\facade\Event`類進行靜態調用 事件系統使用了觀察者模式,提供了解耦應用的更好方式。在你需要監聽事件的位置,添加如下代碼: ``` Event::trigger('UserLogin'); ``` 或者使用助手函數 ``` event('UserLogin'); ``` 這里`UserLogin`表示一個事件標識,如果你定義了單獨的事件類,你可以使用事件類名,甚至可以傳入一個事件類實例。 ``` event('app\event\UserLogin'); ``` 事件類可以通過命令行快速生成 ``` php think make:event UserLogin ``` 默認會生成一個`app\event\UserLogin`事件類,也可以指定完整類名生成。 我們可以給事件類添加方法 ``` namespace app\event; use app\model\User; class UserLogin { public $user; public function __construct(User $user) { $this->user = $user; } } ``` 一般事件類無需繼承任何其它類。 你可以給事件類綁定一個事件標識 ``` Event::bind('UserLogin', 'app\event\UserLogin'); ``` 或者在應用的`event.php`事件定義文件中批量綁定。 ``` return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件綁定 ], ]; ``` 如果你沒有定義事件類的話,則無需綁定。 >[info] ThinkPHP的事件系統不依賴事件類,如果沒有額外的需求,僅通過事件標識也可以使用。 你可以在`event`方法中傳入一個事件參數 ``` event('UserLogin', $user); ``` ## 事件監聽 你可以手動注冊一個事件監聽 ``` Event::listen('UserLogin', function($user) { // }); ``` 或者使用監聽類 ``` Event::listen('UserLogin', 'app\listener\UserLogin'); ``` 可以通過命令行快速生成一個事件監聽類 ``` php think make:listener UserLogin ``` 默認會生成一個`app\listener\UserLogin`事件監聽類,也可以指定完整類名生成。 事件監聽類只需要定義一個`handler`方法,支持依賴注入。 ~~~ <?php namespace app\listener; class UserLogin { public function handle($user) { // 事件監聽處理 } } ~~~ 在`handler`方法中如果返回了`false`,則表示監聽中止,將不再執行該事件后面的監聽。 一般建議直接在事件定義文件中定義對應事件的監聽。 ``` return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件綁定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件監聽 ], ]; ``` ## 事件訂閱 可以通過事件訂閱機制,在一個監聽器中監聽多個事件,例如通過命令行生成一個事件訂閱者類, ``` php think make:subscribe User ``` 默認會生成`app\subscribe\User`類,或者你可以指定完整類名生成。 然后你可以在事件訂閱類中添加不同事件的監聽方法,例如。 ~~~ <?php namespace app\subscribe; class User { public function onUserLogin($user) { // 事件響應處理 } public function onUserLogout($user) { // 事件響應處理 } } ~~~ 監聽事件的方法命名規范是`on`+事件標識(駝峰命名),然后注冊該事件訂閱 ``` Event::subscribe('app\subscribe\User'); ``` 一般建議直接在事件定義文件中定義 ``` return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件綁定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件監聽 ], 'subscribe' => [ '\app\subscribe\User', // 更多事件訂閱 ], ]; ``` ## 內置事件 內置的系統事件包括: | 事件| 描述 | 參數 | | --- | --- | --- | | AppInit | 應用初始化標簽位 | 無 | | HttpRun | 應用開始標簽位 | 無 | | HttpEnd | 應用結束標簽位 | 當前響應對象實例 | | LogWrite | 日志write方法標簽位 | 當前寫入的日志信息 | | LogLevel | 日志寫入標簽位 | 包含日志類型和日志信息的數組 | >[danger] `AppInit`事件定義必須在全局事件定義文件中定義,其它事件支持在應用的事件定義文件中定義。 原來`5.1`的一些行為標簽已經廢棄,所有取消的標簽都可以使用中間件更好的替代。可以把中間件看成處理請求以及響應輸出相關的特殊事件。事實上,中間件的`handle`方法只是具有特殊的參數以及返回值而已。 ## 查詢事件 數據庫操作的回調也稱為查詢事件,是針對數據庫的CURD操作而設計的回調方法,主要包括: | 事件 | 描述 | | --- | --- | | before\_select | `select`查詢前回調 | | before\_find | `find`查詢前回調 | | after\_insert | `insert`操作成功后回調 | | after\_update | `update`操作成功后回調 | | after\_delete | `delete`操作成功后回調 | 使用下面的方法注冊數據庫查詢事件 ~~~ \think\facade\Db::event('before_select', function ($query) { // 事件處理 return $result; }); ~~~ 同一個查詢事件可以注冊多個響應執行。查詢事件在新版里面也已經被事件系統接管了,因此如果你注冊了一個`before_select`查詢事件監聽,底層其實是向標識為`db.before_select`的事件注冊了一個監聽。 >[danger] 查詢事件的方法參數只有一個:當前的查詢對象。但你可以通過依賴注入的方式添加額外的參數。 ## 模型事件 模型事件是指在進行模型的查詢和寫入操作的時候觸發的操作行為。 >[danger] 模型事件只在調用模型的方法生效,使用查詢構造器操作是無效的 模型支持如下事件: |事件|描述|事件方法名| |---|---|---| |after_read | 查詢后 |onAfterRead| |before_insert | 新增前 |onBeforeInsert| |after_insert | 新增后 |onAfterInsert| |before_update | 更新前 |onBeforeUpdate| |after_update| 更新后 |onAfterUpdate| |before_write| 寫入前 |onBeforeWrite| |after_write | 寫入后 |onAfterWrite| |before_delete | 刪除前 |onBeforeDelete| |after_delete | 刪除后 |onAfterDelete| |before_restore | 恢復前 |onBeforeRestore| |after_restore | 恢復后 |onAfterRestore| 注冊的回調方法支持傳入一個參數(當前的模型對象實例),但支持依賴注入的方式增加額外參數。 >[info] 如果`before_write`、`before_insert`、 `before_update` 、`before_delete`事件方法中返回`false`或者拋出`think\exception\ModelEventException`異常的話,則不會繼續執行后續的操作。 ### 模型事件定義 最簡單的方式是在模型類里面定義靜態方法來定義模型的相關事件響應。 ~~~ <?php namespace app\index\model; use think\Model; use app\index\model\Profile; class User extends Model { public static function onBeforeUpdate($user) { if ('thinkphp' == $user->name) { return false; } } public static function onAfterDelete($user) { Profile::destroy($user->id); } } ~~~ 參數是當前的模型對象實例,支持使用依賴注入傳入更多的參數。 ### 模型事件觀察者 如果希望模型的事件單獨管理,可以給模型注冊一個事件觀察者,例如: ~~~ <?php namespace app\index\model; use think\Model; class User extends Model { protected $observerClass = 'app\index\observer\User'; } ~~~ `User`觀察者類定義如下: ~~~ <?php namespace app\index\observer; use app\index\model\Profile; class User { public function onBeforeUpdate($user) { if ('thinkphp' == $user->name) { return false; } } public function onAfterDelete($user) { Profile::destroy($user->id); } } ~~~ >[info] 觀察者類的事件響應方法的第一個參數就是模型對象實例,你依然可以通過依賴注入傳入其它的對象參數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看