<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 事件管理器(Events Manager) # 事件管理器(Events Manager) 此組件的目的是為了通過創建“鉤子”攔截框架中大部分的組件操作。這些鉤子允許開發者獲得狀態信息,操縱數據或者改變某個組件進程中的執行流向。 ### 使用示例(Usage Example) 以下面示例中,我們使用EventsManager來偵聽在 [*Phalcon\\Db*](#) 管理下的MySQL連接中產生的事件。首先,我們需要一個偵聽者對象來完成這部分的工作。我們創建了一個類,這個類有我們需要偵聽事件所對應的方法: ``` <pre class="calibre14">``` <?php class MyDbListener { public function afterConnect() { } public function beforeQuery() { } public function afterQuery() { } } ``` ``` 這個新的類可能有點啰嗦,但我們需要這樣做。事件管理器在組件和我們的偵聽類之間充當著接口角色,并提供了基于在我們偵聽類中所定義方法的鉤子: ``` <pre class="calibre14">``` <?php use Phalcon\Events\Manager as EventsManager; use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter; $eventsManager = new EventsManager(); // 創建一個數據庫偵聽 $dbListener = new MyDbListener(); // 偵聽全部數據庫事件 $eventsManager->attach('db', $dbListener); $connection = new DbAdapter( array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "invo" ) ); // 將$eventsManager賦值給數據庫甜適配器 $connection->setEventsManager($eventsManager); // 發送一個SQL命令到數據庫服務器 $connection->query("SELECT * FROM products p WHERE p.status = 1"); ``` ``` 為了紀錄我們應用中全部執行的SQL語句,我們需要使用“afterQuery”事件。第一個傳遞給事件偵聽者的參數包含了關于正在運行事件的上下文信息,第二個則是連接本身。 ``` <pre class="calibre14">``` <?php use Phalcon\Logger\Adapter\File as Logger; class MyDbListener { protected $_logger; public function __construct() { $this->_logger = new Logger("../apps/logs/db.log"); } public function afterQuery($event, $connection) { $this->_logger->log($connection->getSQLStatement(), \Phalcon\Logger::INFO); } } ``` ``` 作為些示例的一部分,我們同樣實現了 Phalcon\\Db\\Profiler 來檢測SQL語句是否超出了期望的執行時間: ``` <pre class="calibre14">``` <?php use Phalcon\Db\Profiler; use Phalcon\Logger; use Phalcon\Logger\Adapter\File; class MyDbListener { protected $_profiler; protected $_logger; /** *創建分析器并開始紀錄 */ public function __construct() { $this->_profiler = new Profiler(); $this->_logger = new Logger("../apps/logs/db.log"); } /** * 如果事件觸發器是'beforeQuery',此函數將會被執行 */ public function beforeQuery($event, $connection) { $this->_profiler->startProfile($connection->getSQLStatement()); } /** * 如果事件觸發器是'afterQuery',此函數將會被執行 */ public function afterQuery($event, $connection) { $this->_logger->log($connection->getSQLStatement(), Logger::INFO); $this->_profiler->stopProfile(); } public function getProfiler() { return $this->_profiler; } } ``` ``` 可以從偵聽者中獲取結果分析數據: ``` <pre class="calibre14">``` <?php // 發送一個SQL命令到數據庫服務器 $connection->execute("SELECT * FROM products p WHERE p.status = 1"); foreach ($dbListener->getProfiler()->getProfiles() as $profile) { echo "SQL語句: ", $profile->getSQLStatement(), "\n"; echo "開始時間: ", $profile->getInitialTime(), "\n"; echo "結束時間: ", $profile->getFinalTime(), "\n"; echo "總共執行的時間: ", $profile->getTotalElapsedSeconds(), "\n"; } ``` ``` 類似地,我們可以注冊一個匿名函數來執行這些任務,而不是再分離出一個偵聽類(如上面看到的): ``` <pre class="calibre14">``` <?php // 偵聽全部數據加事件 $eventManager->attach('db', function ($event, $connection) { if ($event->getType() == 'afterQuery') { echo $connection->getSQLStatement(); } }); ``` ``` ### 創建組件觸發事件(Creating components that trigger Events) 你可以在你的應用中為事件管理器的觸發事件創建組件。這樣的結果是,可以有很多存在的偵聽者為這些產生的事件作出響應。在以下的示例中,我們將會創建一個叫做“MyComponent”組件。這是個意識事件管理器組件;當它的方法“someTask”被執行時它將觸發事件管理器中全部偵聽者的兩個事件: ``` <pre class="calibre14">``` <?php use Phalcon\Events\EventsAwareInterface; class MyComponent implements EventsAwareInterface { protected $_eventsManager; public function setEventsManager($eventsManager) { $this->_eventsManager = $eventsManager; } public function getEventsManager() { return $this->_eventsManager; } public function someTask() { $this->_eventsManager->fire("my-component:beforeSomeTask", $this); // 做一些你想做的事情 $this->_eventsManager->fire("my-component:afterSomeTask", $this); } } ``` ``` 注意到這個組件產生的事件都以“my-component”為前綴。這是一個唯一的關鍵詞,可以幫助我們區分各個組件產生的事件。你甚至可以在組件的外面生成相同名字的事件。現在讓我們來為這個組件創建一個偵聽者: ``` <pre class="calibre14">``` <?php class SomeListener { public function beforeSomeTask($event, $myComponent) { echo "這里, beforeSomeTask\n"; } public function afterSomeTask($event, $myComponent) { echo "這里, afterSomeTask\n"; } } ``` ``` 偵聽者可以是簡單的一個實現了全部組件觸發事件的類。現在讓我們把全部的東西整合起來: ``` <pre class="calibre14">``` <?php use Phalcon\Events\Manager as EventsManager; // 創建一個事件管理器 $eventsManager = new EventsManager(); // 創建MyComponent實例 $myComponent = new MyComponent(); // 將事件管理器綁定到創建MyComponent實例實例 $myComponent->setEventsManager($eventsManager); // 為事件管理器附上偵聽者 $eventsManager->attach('my-component', new SomeListener()); // 執行組件的方法 $myComponent->someTask(); ``` ``` 當“someTask”被執行時,在偵聽者里面的兩個方法將會被執行,并產生以下輸出: ``` <pre class="calibre14">``` 這里, beforeSomeTask 這里, afterSomeTask ``` ``` 當觸發一個事件時也可以使用“fire”中的第三個參數來傳遞額外的數據: ``` <pre class="calibre14">``` <?php $eventsManager->fire("my-component:afterSomeTask", $this, $extraData); ``` ``` 在一個偵聽者里,第三個參數可用于接收此參數: ``` <pre class="calibre14">``` <?php // 從第三個參數接收數據 $eventManager->attach('my-component', function ($event, $component, $data) { print_r($data); }); // 從事件上下文中接收數據 $eventManager->attach('my-component', function ($event, $component) { print_r($event->getData()); }); ``` ``` 如果一個偵聽者僅是對某個特定類型的事件感興趣,你要吧直接附上一個偵聽者: ``` <pre class="calibre14">``` <?php // 這個處理器只會在“beforeSomeTask”事件觸發時才被執行 $eventManager->attach('my-component:beforeSomeTask', function ($event, $component) { // ... }); ``` ``` ### 事件傳播與取消(Event Propagation/Cancellation) 可能會有多個偵聽者添加到同一個事件管理器,這意味著對于相同的事件會通知多個偵聽者。這些偵聽者會以它們在事件管理器注冊的順序來通知。有些事件是可以被取消的,暗示著這些事件可以被終止以防其他偵聽都再收到事件的通知: ``` <pre class="calibre14">``` <?php $eventsManager->attach('db', function ($event, $connection) { // 如果可以取消,我們就終止此事件 if ($event->isCancelable()) { // 終止事件,這樣的話其他偵聽都就不會再收到此通知 $event->stop(); } // ... }); ``` ``` 默認情況下全部的事件都是可以取消的,甚至框架提供的事件也是可以取消的。你可以通過在fire中的第四個參數中傳遞false來指明這是一個不可取消的事件: ``` <pre class="calibre14">``` <?php $eventsManager->fire("my-component:afterSomeTask", $this, $extraData, false); ``` ``` ### 偵聽器優先級(Listener Priorities) 當附上偵聽者時,你可以設置一個優先級。使用此特性,你可以指定這些偵聽者被調用的固定順序: ``` <pre class="calibre14">``` <?php $evManager->enablePriorities(true); $evManager->attach('db', new DbListener(), 150); // 高優先級 $evManager->attach('db', new DbListener(), 100); // 正常優先級 $evManager->attach('db', new DbListener(), 50); // 低優先級 ``` ``` ### 收集響應(Collecting Responses) 事件管理器可以收集每一個被通知的偵聽者返回的響應,以下這個示例解釋了它是如何工作的: ``` <pre class="calibre14">``` <?php use Phalcon\Events\Manager as EventsManager; $evManager = new EventsManager(); // 建立事件管理器以為收集結果響應 $evManager->collectResponses(true); // 附上一個偵聽者 $evManager->attach('custom:custom', function () { return 'first response'; }); // 附上一個偵聽者 $evManager->attach('custom:custom', function () { return 'second response'; }); // 執行fire事件 $evManager->fire('custom:custom', null); // 獲取全部收集到的響應 print_r($evManager->getResponses()); ``` ``` 上面示例將輸出: ``` <pre class="calibre14">``` Array ( [0] => first response [1] => second response ) ``` ``` ### 自定義事件管理器(Implementing your own EventsManager) 如果想要替換Phalcon提供的事件管理器,必須實現 [*Phalcon\\Events\\ManagerInterface*](#) 中的接口。 | - [索引](# "總目錄") - [下一頁](# "Request Environment") | - [上一頁](# "使用命名空間(Working with Namespaces)") |
                  <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>

                              哎呀哎呀视频在线观看