国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 php教程 PHP開發(fā) Zend Framework 2.0事件管理器(The EventManager)入門教學(xué)課程

Zend Framework 2.0事件管理器(The EventManager)入門教學(xué)課程

Jan 05, 2017 am 10:19 AM

概述

EventManger是一個為以下使用情況設(shè)計的組件:

實現(xiàn)簡單的主題/觀察者模式
實現(xiàn)面向切面的設(shè)計
實現(xiàn)事件驅(qū)動的架構(gòu)

基本的架構(gòu)允許你添加和解除指定事件的偵聽器,無論是在一個實例基礎(chǔ)或一個共享的集合;觸發(fā)事件;終止偵聽器的執(zhí)行。

快速入門

通常,你將會在一個類別中建立一個EventManager。

use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
 
class Foo implements EventManagerAwareInterface
{
    protected $events;
 
    public function setEventManager(EventManagerInterface $events)
    {
        $events->setIdentifiers(array(
            __CLASS__,
            get_called_class(),
        ));
        $this->events = $events;
        return $this;
    }
 
    public function getEventManager()
    {
        if (null === $this->events) {
            $this->setEventManager(new EventManager());
        }
        return $this->events;
    }
}

上面的程式碼允許使用者存取EventManager實例,或使用一個新的實例來重置它;如果不存在,它將會在被用到的時候惰性實例化。

EventManager僅僅對它是否觸發(fā)了一些事件感興趣?;A(chǔ)的觸發(fā)接受三個參數(shù):事件的名字,它通常是當(dāng)前的函數(shù)/方法名稱;上下文,它通常是當(dāng)前的物件的實例;和參數(shù),它通常是提供給當(dāng)前函數(shù)/方法的參數(shù)。

class Foo
{
    // ... assume events definition from above
 
    public function bar($baz, $bat = null)
    {
        $params = compact('baz', 'bat');
        $this->getEventManager()->trigger(__FUNCTION__, $this, $params);
    }
}

按順序,觸發(fā)事件僅關(guān)心否有一些東西偵聽了事件。偵聽器新增至EventManager,指定一個指定的事件和要通知的回呼?;卣{(diào)接受一個Event對象,它有一個用於取得事件名字,上下文和參數(shù)的存取器。讓我們新增一個偵聽器,並且觸發(fā)事件。

use Zend\Log\Factory as LogFactory;
 
$log = LogFactory($someConfig);
$foo = new Foo();
$foo->getEventManager()->attach('bar', function ($e) use ($log) {
    $event  = $e->getName();
    $target = get_class($e->getTarget());
    $params = json_encode($e->getParams());
 
    $log->info(sprintf(
        '%s called on %s, using params %s',
        $event,
        $target,
        $params
    ));
});
 
// Results in log message:
$foo->bar('baz', 'bat');
// reading: bar called on Foo, using params {"baz" : "baz", "bat" : "bat"}"

注意,attach()的第二個參數(shù)是一個任何有效的回調(diào);例子中展示了一個匿名函數(shù)來保持例子是自包含的。然而,你同樣可以使用一個有效的函數(shù)名字,一個函數(shù)對象,一個引用靜態(tài)方法的字串,或一個帶有一個指定靜態(tài)方法或?qū)嵗椒ǖ幕卣{(diào)數(shù)組。再一次,任何PHP回調(diào)都是有效的。

有時候你可能想要指定一個偵聽器沒有一個建立了一個EventManager的類別的物件實例。 Zend Framework透過一個SharedEventCollection的概念來實現(xiàn)它。簡單的說,你可以使用一個眾所周知的SharedEventCollection來注入一個獨立的EventManager實例,而EventManager實例將會為附加的偵聽器來查詢它。新增至SharedEventCollection的偵聽器與正常的事件管理器大略相同;呼叫attach與EventManager完全相同,但在開始需要一個附加的參數(shù):一個指定的實例。還記得創(chuàng)建一個EventManager的實例,我們是如何傳遞給他__CLASS__的?在使用一個SharedEventCollection時,那個值,或任何你提供給建構(gòu)器的陣列中的任何字串,可能用來識別一個實例。作為一個範(fàn)例,假設(shè)我們有一個SharedEventManager實例我們知道已經(jīng)被注入到我們的EventManager實例中了(對於實例,透過依賴注入),我們可以更改上面的例子來透過共享集合來新增:

use Zend\Log\Factory as LogFactory;
 
// Assume $events is a Zend\EventManager\SharedEventManager instance
 
$log = LogFactory($someConfig);
$events->attach('Foo', 'bar', function ($e) use ($log) {
    $event  = $e->getName();
    $target = get_class($e->getTarget());
    $params = json_encode($e->getParams());
 
    $log->info(sprintf(
        '%s called on %s, using params %s',
        $event,
        $target,
        $params
    ));
});
 
// Later, instantiate Foo:
$foo = new Foo();
$foo->getEventManager()->setSharedEventCollection($events);
 
// And we can still trigger the above event:
$foo->bar('baz', 'bat');
// results in log message:
// bar called on Foo, using params {"baz" : "baz", "bat" : "bat"}"

注意:StaticEventManager

在2.0.0beta3中,你可以使用StaticEventManager單例作為一個SharedEventCollection。這樣,你不需要擔(dān)心在哪裡或如何來存取SharedEventCollection;它透過簡單的呼叫StaticEventManager::getInstance()是全域可用的。

要知道,然而,框架不贊成它的使用,並且在2.0.0beta4中,你將透過設(shè)定一個SharedEventManager實例並注入到一個單獨的EventManager實例中來取代它。

通配符偵聽器

有時候你可能會想要為一個給定的實例的很多事件或全部事件添加相同的偵聽器,或者可能,使用一個共享事件集合,很多上下文,並且很多事件。 EventManager元件允許這樣做。

一次添加多個事件

$events = new EventManager();
$events->attach(array('these', 'are', 'event', 'names'), $callback);

透過通配符添加

$events = new EventManager();
$events->attach('*', $callback);

注意如果你指定了一個優(yōu)先級,那個優(yōu)先級將會用於這個偵聽器觸發(fā)的任何事件。

上面的程式碼指定的是任何時間觸發(fā)將會導(dǎo)致這個特定偵聽器的通知。

透過一個SharedEventManager一次新增多個事件

$events = new SharedEventManager();
// Attach to many events on the context "foo"
$events->attach('foo', array('these', 'are', 'event', 'names'), $callback);
 
// Attach to many events on the contexts "foo" and "bar"
$events->attach(array('foo', 'bar'), array('these', 'are', 'event', 'names'), $callback);

注意如果你指定了一個優(yōu)先權(quán),那個優(yōu)先權(quán)將會被用於所有指定的事件。

透過一個SharedEventManager一次加入所有事件

$events = new SharedEventManager();
// Attach to all events on the context "foo"
$events->attach('foo', '*', $callback);
 
// Attach to all events on the contexts "foo" and "bar"
$events->attach(array('foo', 'bar'), '*', $callback);

注意如果你指定了一個優(yōu)先權(quán),那個優(yōu)先權(quán)將會被用於所有指定的事件。

上面的程式碼指定了上下文“foo”和“bar”,指定的偵聽器將會在任何事件觸發(fā)時被通知。

配置選項

EventManager選項

標(biāo)識符

給定的EventManager實例可以回答的字串或字串?dāng)?shù)組,當(dāng)透過一個SharedEventManager存取時。

event_class

一個替代的Event類別的名字用來代表傳給偵聽器的事件。

shared_collections

當(dāng)觸發(fā)事件時的一個SharedEventCollection實例。

可用方法

__construct

__construct(null|string|int Sidentifier)

構(gòu)造一個新的EventManager實例,使用給定的識別符,如果提供了的話,為了共享集合的目的。

setEventClass

setEventClass(string $class)

提供替換Event類別的名字用在建立傳遞給觸發(fā)的偵聽器的事件時。

setSharedCollections

setSharedCollections(SharedEventCollection $collections=null)

用於觸發(fā)事件時的SharedEventCollection實例。

getSharedCollections

getSharedCollections()

傳回目前新增的SharedEventCollection實例。如果沒有新增集合,則傳回空,或一個SharedEventCollection實例。

trigger

trigger(string $event, mixed $target, mixed $argv, callback $callback)

觸發(fā)所有指定事件的偵聽器。推薦為$event使用目前的函數(shù)/方法名,在後面加上諸如“.pre”、“.post”等,如果有需要的話。 $context應(yīng)該是目前物件的實例,或者是函數(shù)的名字如果不是使用物件觸發(fā)。 $params通常應(yīng)該是關(guān)聯(lián)陣列或ArrayAccess實例;我們建議使用傳遞給函數(shù)/方法的參數(shù)(compact()在這裡通常很有用)。這個方法同樣可以接受一個回呼且表現(xiàn)與triggerUntil()相同。

方法傳回一個ResponseCollection的實例,它可以用來反省各種各樣的偵聽器傳回的值,測試短路,以及更多。

triggerUntil

triggerUntil(string $event, mixed $context, mixed $argv, callback $callback)

觸發(fā)指定事件的所有偵聽器,就像trigger(),額外的是它將每個偵聽器的回傳值傳遞給$callback;如果$callback回傳一個布林true值,則偵聽器的執(zhí)行將會終止。你可以使用$result->stopped()來測試它。

attach

attach(string $event, callback $callback, int $priority)

新增$callback到EventManager實例,偵聽事件$event。如果提供了一個$priority,偵聽器將會使用那個優(yōu)先權(quán)插入到內(nèi)部的偵聽器堆疊;高的值會先執(zhí)行。 (預(yù)設(shè)的優(yōu)先權(quán)是“1”,並且執(zhí)行使用負(fù)的值。)

方法傳回一個ZendStdlibCallbackHandler的實例;這個值可以在稍後傳遞給detach(),如果需要的話。

attachAggregate

attachAggregate(string|ListenerAggregate $aggregate)

如果一個字串被傳遞作為$aggregate,實例化那個類別。 $aggregate然後被傳遞給EventManager實例的attache()方法因此他可以註冊偵聽器。

回傳ListenerAggregate實例。

detach

detach(CallbackHandler $listener)

掃描所有的偵聽器,並且取消匹配$listener的所有偵聽器因此它們將不再會被觸發(fā)。

傳回一個true布林值如果任何偵聽器已經(jīng)被指定並且取消訂閱,否則傳回一個false布林值。

detachAggregate

detachAggregate(ListenerAggregate $aggregate)

循環(huán)所有的事件來決定集合代表的偵聽器;對於所有的匹配項,偵聽器將會被移除。

如果任何偵聽器被確定並被取消訂閱傳回一個true布林值,否則傳回一個false布林值。

getEvents

getEvent()

傳回一個有偵聽器附加的所有事件名字的陣列。

getListeners

getListeners(string $event)

回傳一個加入$event的所有偵聽器的ZendStdlibPriorityQueue實例

clearListeners

clearListeners(器。

prepareArgs

prepareArgs(array $args)

從提供的$args建立一個ArrayObject。如果你想要你的偵聽器可以更改參數(shù)讓稍後的偵聽器或觸發(fā)的方法可以看到這些更改的情況下著將會很有用。

更多Zend Framework 2.0事件管理器(The EventManager)入門教學(xué)相關(guān)文章請關(guān)注PHP中文網(wǎng)!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)