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

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

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

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è)類中創(chuàng)建一個(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ā)了一些事件感興趣?;A(chǔ)的觸發(fā)接受三個(gè)參數(shù):事件的名字,它通常是當(dāng)前的函數(shù)/方法名;上下文,它通常是當(dāng)前的對(duì)象的實(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)?;卣{(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è)創(chuàng)建了一個(gè)EventManager的類的對(duì)象實(shí)例。Zend Framework通過一個(gè)SharedEventCollection的概念來實(shí)現(xiàn)它。簡單的說,你可以使用一個(gè)眾所周知的SharedEventCollection來注入一個(gè)獨(dú)立的EventManager實(shí)例,并且EventManager實(shí)例將會(huì)為附加的偵聽器來查詢它。添加到SharedEventCollection的偵聽器與正常的事件管理器大略相同;調(diào)用attach與EventManager完全相同,但是在開始需要一個(gè)附加的參數(shù):一個(gè)指定的實(shí)例。還記得創(chuàng)建一個(gè)EventManager的實(shí)例,我們是如何傳遞給他__CLASS__的?在使用一個(gè)SharedEventCollection時(shí),那個(gè)值,或者任何你提供給構(gòu)造器的數(shù)組中的任何字符串,可能用于識(shí)別一個(gè)實(shí)例。作為一個(gè)示例,假設(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;它通過簡單的調(diào)用StaticEventManager::getInstance()是全局可用的。

要知道,然而,框架不贊成它的使用,并且在2.0.0beta4中,你將通過配置一個(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)先級(jí),那個(gè)優(yōu)先級(jí)將會(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)先級(jí),那個(gè)優(yōu)先級(jí)將會(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í)例,使用給定的標(biāo)識(shí)符,如果提供了的話,為了共享集合的目的。

setEventClass

setEventClass(string $class)

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

setSharedCollections

setSharedCollections(SharedEventCollection $collections=null)

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

getSharedCollections

getSharedCollections()

返回當(dāng)前添加到的SharedEventCollection實(shí)例。如果沒有添加集合,返回空,或者一個(gè)SharedEventCollection實(shí)例。

trigger

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

觸發(fā)指定事件的所有偵聽器。推薦為$event使用當(dāng)前的函數(shù)/方法名,在后面加上諸如“.pre”、“.post”等,如果有需要的話。$context應(yīng)該是當(dāng)前對(duì)象的實(shí)例,或者是函數(shù)的名字如果不是使用對(duì)象觸發(fā)。$params通常應(yīng)該是一個(gè)關(guān)聯(lián)數(shù)組或者ArrayAccess實(shí)例;我們推薦使用傳遞給函數(shù)/方法的參數(shù)(compact()在這里通常很有用處)。這個(gè)方法同樣可以接受一個(gè)回調(diào)并且表現(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í)行將被終止。你可以使用$result->stopped()來測(cè)試它。

attach

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

添加$callback到EventManager實(shí)例,偵聽事件$event。如果提供了一個(gè)$priority,偵聽器將會(huì)使用那個(gè)優(yōu)先級(jí)插入到內(nèi)部的偵聽器堆棧;高的值會(huì)先執(zhí)行。(默認(rèn)的優(yōu)先級(jí)是“1”,并且運(yùn)行使用負(fù)的值。)

方法返回一個(gè)Zend\Stdlib\CallbackHandler的實(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è)有偵聽器附加的所有事件名字的數(shù)組。

getListeners

getListeners(string $event)

返回一個(gè)添加到$event的所有偵聽器的Zend\Stdlib\PriorityQueue實(shí)例

clearListeners

clearListeners(string $event)

移除添加到$event的所有偵聽器。

prepareArgs

prepareArgs(array $args)

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

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

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系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脫衣機(jī)

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)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276