在Zend框架2事件管理教程(的eventmanager)

总结

eventmanger是一个组件用于以下用途:

复制代码代码如下所示:

实现一个简单的主题/观察者模式

面向面设计的实现

事件驱动体系结构



基本架构允许您添加和禁用指定事件的侦听器,不管是基于实例还是共享集、触发器事件,以及终止侦听器的执行。

快速入门

通常,您将创建一个类中的一个eventmanager。

复制代码代码如下所示:

使用Zend eventmanagerinterface eventmanager;

使用Zend eventmanager eventmanager;

使用Zend eventmanagerawareinterface eventmanager;



eventmanagerawareinterface Foo类的实现

{

受保护的$事件;



公共功能seteventmanager(eventmanagerinterface $事件)

{

$事件-> setidentifiers(阵列(

__class__,

get_called_class(),

));

$ >事件= $事件;

返回$此;

}



公共功能geteventmanager()

{

如果(空= $)事件{

美元-> seteventmanager(新eventmanager());

}

返回$ >事件;

}

}



上面的代码允许用户访问的情况下eventmanager,或重置他们的一个新实例;如果它不存在,它将被实例化时使用。

eventmanager只关心是否触发一些事件。基地接受三个参数:触发的事件的名称,通常是当前函数/方法的名称;语境,它通常是当前对象的实例;和参数通常是提供给当前函数或方法的参数。

复制代码代码如下所示:

类Foo

{

从上面假定事件定义…



公共功能栏(Baz美元,美元蝙蝠= null)

{

('baz $params =紧凑,蝙蝠);

美元-> geteventmanager()->触发器(__function__,美元,$params);

}

}



为了触发事件只关心一件事,听事件。侦听器添加到eventmanager,指定一个指定的事件和回调函数来通知。回调接受事件对象,有一个访问得到的名称,背景,和参数的事件。让我们添加一个侦听器和触发器事件。

复制代码代码如下所示:

使用Zend 日志厂LogFactory;



日志= logfactory美元(美元someconfig);

$ =新富();

变量$foo -> geteventmanager()()->附加('bar功能(e)使用($日志){)

事件=美元美元E -> getName();

目标= get_class美元($ E -> gettarget());

json_encode $params =(a -> getparams());



为日志->信息(sprintf(

%s为%s,使用参数%s,

$事件,

为目标,

$params

));

});



在日志消息中:结果

变量$foo ->酒吧('baz,蝙蝠);

阅读:酒吧叫 / foo使用params {巴兹:巴兹



注意,第二参数的高度()是一个有效的回调;在这个例子中,一个匿名函数所包含的示例保持自我。然而,你也可以使用一个有效的函数名,函数对象,一个字符串,指的是静态的方法,或一个回调阵列与指定的静态方法或实例方法。再次,任何PHP回调是有效的。

有时您可能需要指定一个听众没有一个类创建一个对象实例eventmanager。Zend框架实现了通过sharedeventcollection概念。简单来说,你可以使用一个著名的sharedeventcollection注入一个独立的eventmanager实例,并eventmanager实例查询它额外增加sharedeventcollection的听众。听众几乎是正常的事件管理器相同。呼叫连接是完全一样的eventmanager,但是在开始的时候,它需要一个额外的参数:指定实例。记得如何创建eventmanager实例,我们怎么把球传给他__class__当使用sharedeventcollection,价值,或任何您提供的字符串的构造函数,可以用来识别的实例。例如,假设我们有一个sharedeventmanager实例,我们知道它已经注入我们的eventmanager实例。(例如,通过依赖注入),我们可以更改上面的示例以通过共享集进行添加。

复制代码代码如下所示:

使用Zend 日志厂LogFactory;



美元的事件是一个Zend eventmanager sharedeventmanager实例 / /假设



日志= logfactory美元(美元someconfig);

$事件->附加('foo ','bar功能(e)使用($日志){)

事件=美元美元E -> getName();

目标= get_class美元($ E -> gettarget());

json_encode $params =(a -> getparams());



为日志->信息(sprintf(

%s为%s,使用参数%s,

$事件,

为目标,

$params

));

});



实例化。

$ =新富();

foo()geteventmanager美元-> -> setsharedeventcollection($事件);



我们仍然可以触发上面的事件:

变量$foo ->酒吧('baz,蝙蝠);

在日志消息中:结果

呼吁 / /酒吧foo使用params {巴兹:巴兹



注:staticeventmanager

在2.0.0beta3,您可以使用staticeventmanager单独作为一个sharedeventcollection。这样,你不需要担心在哪里或如何访问sharedeventcollection;通过简单地调用staticeventmanager是全球可用的::getInstance()。

你知道的,但是,这个框架不同意其使用,并在2.0.0beta4,将配置一个sharedeventmanager实例并把它注入到一个单独的eventmanager实例而不是。

通配符的倾听者

有时你可能想添加相同的听众很多事件或一个给定的实例的事件,或者使用一个共享的事件集,许多情况下,许多events.eventmanager组件允许这样做。

一次添加多个事件

复制代码代码如下所示:

事件=新eventmanager(美元);

$事件->附加(阵列(这些',' ',' ','event,'names)美元回调);



通过添加通配符

复制代码代码如下所示:

事件=新eventmanager(美元);

$事件>附加(*,$回调);



请注意,如果指定了优先级,则该优先级将用于侦听器触发的任何事件。

上面的代码指定任何时间触发都会导致这个特定侦听器的通知。

一sharedeventmanager添加多个事件

复制代码代码如下所示:

事件=新sharedeventmanager(美元);

附加到上下文上的许多事件

$事件->附加('foo,阵列(这些',' ',' ','event,'names)美元回调);



在附加上下文和bar中的许多事件

$事件->附加(阵列('foo ','bar '),数组(这些',' ',' ','event,'names)美元回调);



请注意,如果指定优先级,则该优先级将用于所有指定事件。

把所有的事件在时间的sharedeventmanager

复制代码代码如下所示:

事件=新sharedeventmanager(美元);

附加到上下文上的所有事件

$事件->附加('foo,*,$回调);



对附加上下文和bar中的所有事件

$事件->附加(阵列('foo ','bar '),*,$回调);



请注意,如果指定优先级,则该优先级将用于所有指定事件。

上面的代码指定了上下文富和bar,当触发任何事件时将通知指定的侦听器。

配置选项

eventmanager选项

标识符

一个字符串数组或字符串,一个给定的eventmanager实例可以回答,通过sharedeventmanager访问时。

event_class

事件类的另一个名称用于表示传递给侦听器的事件。

shared_collections

实例sharedeventcollection当事件被触发。

可用的方法

__construct

__construct(空|字符串| int sidentifier)

构建一个新的eventmanager实例,使用一个给定的标识符,如果提供,分享收集的目的。

seteventclass

SetEventClass(字符串类)

当创建传递给触发侦听器的事件时,使用替换事件类的名称。

setsharedcollections

setsharedcollections(sharedeventcollection美元收藏= null)

一个sharedeventcollection实例用来触发一个事件。

getsharedcollections

getsharedcollections()

返回sharedeventcollection实例是目前补充。如果集合不说,回到空荡荡的,或sharedeventcollection实例。

触发

Trigger(字符串的事件,美元美元目标混合,混合参数,回调回调美元)

所有的听众,触发指定的事件。建议为事件使用当前函数或方法的名称,如添加前,后,等,如果必要的。美元的上下文应该当前对象的一个实例,或名称的功能,如果它不是由使用对象触发。$params通常是关联数组或ArrayAccess实例;我们推荐使用传递函数/方法参数(紧凑型()),这是这里通常很有用。这个方法还可以接受一个回调和做人一样triggeruntil()。

该方法返回一个responsecollection可以用来反映价值的实例通过各种听众回来,测试短路,和更多。

triggeruntil

TriggerUntil(字符串的事件,混合美元美元的背景下,混合参数,回调回调美元)

触发指定事件的所有侦听器,就像触发器()一样,额外的是它将每个侦听器的返回值传递给$回调。如果$回调返回一个布尔真值,侦听器的执行将终止。

附上

附加(字符串$事件,回调回调,int优先级)

加上美元回调eventmanager审听事件event.if美元提供美元优先,听者将使用优先插入内部听众栈;高价值将首先执行。(默认优先级是1,和使用。负值)

该方法返回一个Zend 程序 callbackhandler实例;该值可以通过分离()后,如果需要。

AttachAggregate

attachaggregate(字符串| listeneraggregate $骨料)

如果一个字符串作为骨料通过美元,实例化类。$骨料通过武官()的eventmanager实例方法可以让他登记的听众。

回到listeneraggregate实例。

分离

分离(callbackhandler美元的听众)

扫描所有侦听器并取消与侦听器相匹配的所有侦听器,这样它们将不再被触发。

如果任何听众已被指定和退订返回一个布尔值true或false,布尔值返回。

detachaggregate

detachaggregate(listeneraggregate $骨料)

所有事件都循环以确定由集合表示的侦听器;对于所有匹配,侦听器将被删除。

如果任何听众的确定及退订回到真正的布尔值,错误的布尔值返回。

getevents

GetEvent()

返回连接到监听器的所有事件名称的数组。

getlisteners

getlisteners(字符串的事件)

返回一个Zend 程序 PriorityQueue实例添加到事件的所有听众美元

clearlisteners

clearlisteners(字符串的事件)

删除添加到$事件中的所有侦听器。

prepareargs

prepareargs(数组参数)

创建从提供args.if美元你想让你的听众改变参数的数组对象,可以看到这些变化后的听众或触发器的方法可以看到变化。