国产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是一個(gè)為以下使用情況設(shè)計(jì)的組件:

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

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

快速入門

通常,你將會(huì)在一個(gè)類別中建立一個(gè)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實(shí)例,或使用一個(gè)新的實(shí)例來重置它;如果不存在,它將會(huì)在被用到的時(shí)候惰性實(shí)例化。

EventManager僅僅對(duì)它是否觸發(fā)了一些事件感興趣。基礎(chǔ)的觸發(fā)接受三個(gè)參數(shù):事件的名字,它通常是當(dāng)前的函數(shù)/方法名稱;上下文,它通常是當(dāng)前的物件的實(shí)例;和參數(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,指定一個(gè)指定的事件和要通知的回呼?;卣{(diào)接受一個(gè)Event對(duì)象,它有一個(gè)用於取得事件名字,上下文和參數(shù)的存取器。讓我們新增一個(gè)偵聽器,並且觸發(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()的第二個(gè)參數(shù)是一個(gè)任何有效的回調(diào);例子中展示了一個(gè)匿名函數(shù)來保持例子是自包含的。然而,你同樣可以使用一個(gè)有效的函數(shù)名字,一個(gè)函數(shù)對(duì)象,一個(gè)引用靜態(tài)方法的字串,或一個(gè)帶有一個(gè)指定靜態(tài)方法或?qū)嵗椒ǖ幕卣{(diào)數(shù)組。再一次,任何PHP回調(diào)都是有效的。

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

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單例作為一個(gè)SharedEventCollection。這樣,你不需要擔(dān)心在哪裡或如何來存取SharedEventCollection;它透過簡單的呼叫StaticEventManager::getInstance()是全域可用的。

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

通配符偵聽器

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

一次添加多個(gè)事件

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

透過通配符添加

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

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

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

透過一個(gè)SharedEventManager一次新增多個(gè)事件

$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);

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

透過一個(gè)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);

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

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

配置選項(xiàng)

EventManager選項(xiàng)

標(biāo)識(shí)符

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

event_class

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

shared_collections

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

可用方法

__construct

__construct(null|string|int Sidentifier)

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

setEventClass

setEventClass(string $class)

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

setSharedCollections

setSharedCollections(SharedEventCollection $collections=null)

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

getSharedCollections

getSharedCollections()

傳回目前新增的SharedEventCollection實(shí)例。如果沒有新增集合,則傳回空,或一個(gè)SharedEventCollection實(shí)例。

trigger

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

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

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

triggerUntil

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

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

attach

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

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

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

attachAggregate

attachAggregate(string|ListenerAggregate $aggregate)

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

回傳ListenerAggregate實(shí)例。

detach

detach(CallbackHandler $listener)

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

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

detachAggregate

detachAggregate(ListenerAggregate $aggregate)

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

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

getEvents

getEvent()

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

getListeners

getListeners(string $event)

回傳一個(gè)加入$event的所有偵聽器的ZendStdlibPriorityQueue實(shí)例

clearListeners

clearListeners(器。

prepareArgs

prepareArgs(array $args)

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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