Der Eventmanager in Zend soll hauptsächlich Folgendes implementieren:
1. Beobachtermodus
2. Aspektorientiertes Design
3. Ereignisgesteuerte Architektur
Die grundlegendste Funktion des Event-Managements besteht darin, Zuhörer mit Events zu verbinden oder davon zu trennen. Unabhängig davon, ob eine Verbindung besteht oder nicht, erfolgt die Auslösung von Ereignissen und die Ausführung des Interrupt-Listeners durch gemeinsam genutzte Sammlungen.
<span style="color: #0000ff;">use</span><span style="color: #000000;"> Zend\EventManager\EventManagerInterface; </span><span style="color: #0000ff;">use</span><span style="color: #000000;"> Zend\EventManager\EventManager; </span><span style="color: #0000ff;">use</span><span style="color: #000000;"> Zend\EventManager\EventManagerAwareInterface; </span><span style="color: #0000ff;">class</span> Foo <span style="color: #0000ff;">implements</span><span style="color: #000000;"> EventManagerAwareInterface { </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$events</span><span style="color: #000000;">;<br>//将EventManager实例注入到Foo类中 </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setEventManager(EventManagerInterface <span style="color: #800080;">$events</span><span style="color: #000000;">) { </span><span style="color: #800080;">$events</span>-><span style="color: #000000;">setIdentifiers([ </span><span style="color: #ff00ff;">__CLASS__</span>,<span style="color: #000000;"> get_called_class()</span>,<span style="color: #000000;"> ]); </span><span style="color: #800080;">$this</span>->events=<span style="color: #800080;">$events</span><span style="color: #000000;">; </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span><span style="color: #000000;">; }<br>//如果EventManager实例不存在,则新建一个实例。 </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> getEventManager() { </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">null</span> === <span style="color: #800080;">$this</span>-><span style="color: #000000;">events) { </span><span style="color: #800080;">$this</span>->setEventManager(<span style="color: #0000ff;">new</span><span style="color: #000000;"> EventManager()); } </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>-><span style="color: #000000;">events; } }</span>
EventManager ist wirklich daran interessiert, Ereignisse auszulösen, und die einfachste Auslösemethode ist die Methode trigger().
<span style="color: #008000;">/*</span><span style="color: #008000;">file:vendor\zendframework\zend-eventmanager\EventManager.php *trigger方法的具体内容 </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> trigger(<span style="color: #800080;">$eventName</span>, <span style="color: #800080;">$target</span> = <span style="color: #0000ff;">null</span>, <span style="color: #800080;">$argv</span> =<span style="color: #000000;"> []) { </span><span style="color: #800080;">$event</span> = <span style="color: #0000ff;">clone</span> <span style="color: #800080;">$this</span>-><span style="color: #000000;">eventPrototype; </span><span style="color: #800080;">$event</span>->setName(<span style="color: #800080;">$eventName</span><span style="color: #000000;">); </span><span style="color: #800080;">$event</span>->setTarget(<span style="color: #800080;">$target</span><span style="color: #000000;">); </span><span style="color: #800080;">$event</span>->setParams(<span style="color: #800080;">$argv</span><span style="color: #000000;">); </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->triggerListeners(<span style="color: #800080;">$event</span><span style="color: #000000;">); }</span>
Sie können sehen, dass die Methode trigger() tatsächlich das Verhalten des Auslösens des Ereignisses an die Methode triggerListeners() delegiert
Trigger akzeptiert drei Parameter (Ereignisname, Ziel, Parameter)
Die Trigger-Methode erstellt eine Instanz des Ereignisses und löst das Ereignis aus. Der Trigger ruft mehrere Trunkierer auf, beispielsweise setName. Diese Methoden sind in der Event-Klasse zu finden und werden hauptsächlich zum Kapseln der Zielumgebung und der übergebenen Parameter verwendet.
In Bezug auf das Ziel handelt es sich auf der offiziellen Website normalerweise um die aktuelle Objektinstanz. Es ist tatsächlich das Element, das das Ereignis auslöst. Kann als Identifizierung von Ereignissen verstanden werden
Parameter sind die dem Ereignis bereitgestellten Parameter, normalerweise die Parameter, die an die aktuelle Funktion oder Methode übergeben werden.
Beispiel:
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Foo {<br>//....assume events definition from above </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> bar(<span style="color: #800080;">$baz</span>, <span style="color: #800080;">$bat</span> = <span style="color: #0000ff;">null</span><span style="color: #000000;">) { </span><span style="color: #800080;">$params</span> = <span style="color: #008080;">compact</span>('baz', 'bat'<span style="color: #000000;">); </span><span style="color: #800080;">$this</span>->getEventManager()->trigger(<span style="color: #ff00ff;">__FUNCTION__</span>, <span style="color: #800080;">$this</span>, <span style="color: #800080;">$params</span><span style="color: #000000;">); } }</span>
Wie bereits erwähnt, ist EventManager nur daran interessiert, Ereignisse auszulösen. Das auslösende Ereignis kümmert sich hier nur darum, wer dieses Ereignis hört, dh wer ist der Zuhörer?
Der Listener stellt eine Verbindung zum EventManager her, gibt ein benanntes Ereignis und eine Rückruffunktion an, um verwandte Nachrichten zu benachrichtigen (was sind verwandte Nachrichten? Es ist die Nachricht, die Sie benachrichtigen möchten). Die Rückruffunktion muss das Event-Objekt empfangen. Der Getter des Event-Objekts kann den Namen, das Ziel und die Parameter des Ereignisses abrufen (setName ist im vorherigen Codebeispiel enthalten und getName wird umgekehrt verwendet)
Codebeispiel
<span style="color: #0000ff;">use</span> Zend\<span style="color: #008080;">Log</span>\Factory <span style="color: #0000ff;">as</span><span style="color: #000000;"> LogFactory; </span><span style="color: #800080;">$log</span> = LogFactory(<span style="color: #800080;">$someConfig</span><span style="color: #000000;">); </span><span style="color: #800080;">$foo</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Foo(); </span><span style="color: #800080;">$foo</span>->getEventManager()->attach('bar', <span style="color: #0000ff;">function</span>(<span style="color: #800080;">$e</span>) <span style="color: #0000ff;">use</span>(<span style="color: #800080;">$log</span><span style="color: #000000;">) { </span><span style="color: #800080;">$event</span> = <span style="color: #800080;">$e</span>-><span style="color: #000000;">getName(); </span><span style="color: #800080;">$target</span> = <span style="color: #008080;">get_class</span>(<span style="color: #800080;">$e</span>-><span style="color: #000000;">getTarget()); </span><span style="color: #800080;">$params</span> = json_encode(<span style="color: #800080;">$e</span>-><span style="color: #000000;">getParams()); </span><span style="color: #800080;">$log</span>->info(<span style="color: #008080;">sprintf</span><span style="color: #000000;">( </span>'<span style="color: #000000;">%s called on %s, using params %s, $event, $target, $params )); }); //以下bar方法调用时,事件会被触发,监听器便会被执行 $foo->bar(</span>'baz', 'bat'<span style="color: #000000;">) //Result: //bar called on Foo, using params {"baz": "baz", "bat":"bat"}"</span>
attach() kann jede gültige aufrufbare PHP-Funktion sein, es kann eine anonyme Funktion sein oder er kann den Funktionsnamen Funktor oder eine Zeichenfolge verwenden, die auf eine statische Funktion zeigt. ,
Manchmal möchten Sie vielleicht einen neuen Zuhörer erstellen, aber kein neues Ereignis. Wenn Sie also das zuvor erstellte Ereignis verwenden möchten, müssen Sie das vorherige Ereignis auf „gemeinsam“ setzen (d. h. gemeinsam nutzbar, ein Ereignis kann mehrere Listener haben). Wir können diesen Zweck durch SharedEventManager erreichen.
ZendEventManagerSharedEventManagerInterface beschreibt ein Objekt, das mehrere Listener aggregiert. Diese Listener sind über einen Bezeichner mit einem oder mehreren Ereignissen verbunden. SharedEventManager löst diese Ereignisse nicht aus. Im Gegenteil, der EventManager kombiniert den SharedEventManager und fragt dann den ShareEventManager ab, um den Listener mit derselben Identität zu erhalten, und löst ihn dann aus.
<span style="color: #0000ff;">use</span><span style="color: #000000;"> Zend\EventManager\SharedEventManager; </span><span style="color: #800080;">$sharedEvents</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> SharedEventManager(); </span><span style="color: #800080;">$sharedEvents</span>->attach('Foo', 'bar', <span style="color: #0000ff;">function</span>(<span style="color: #800080;">$e</span><span style="color: #000000;">){ </span><span style="color: #800080;">$event</span> = <span style="color: #800080;">$e</span>-><span style="color: #000000;">getName(); </span><span style="color: #800080;">$target</span> =<span style="color: #008080;">get_class</span>(<span style="color: #800080;">$e</span>-><span style="color: #000000;">getTarget()); </span><span style="color: #800080;">$params</span> = <span style="color: #800080;">$e</span>-><span style="color: #000000;">getParams(); </span><span style="color: #008080;">printf</span><span style="color: #000000;">( </span>'Handled event "%s" on target "%s", with parameters %s', <span style="color: #800080;">$event</span>, <span style="color: #800080;">$target</span>,<span style="color: #000000;"> json_encode(</span><span style="color: #800080;">$params</span><span style="color: #000000;">) ); });</span>
Im Vergleich zu zuvor fügt die Attach-Funktion im obigen Code den ersten Parameter hinzu: „Foo“, was bedeutet, dass das Ziel dieses Listeners „Foo“ ist und das Ereignis „Don't come to me for other“ lautet Ziele.
Als wir das Ereignis ursprünglich erstellt haben, haben wir setIdentifiers() verwendet. Diese Funktion legt das Ziel fest, nämlich das Logo.
Zuvor haben wir ShareEventManager verwendet, um einen Listener zu registrieren, der gemeinsam genutzt wird. Hinweis: Ereignisse werden nicht geteilt, Zuhörer werden geteilt. Jetzt müssen wir dem Event Foo nur noch mitteilen, dass Sie einen Listener verwenden können. Wir verwenden den folgenden Code:
<span style="color: #800080;">$foo</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Foo(); </span><span style="color: #800080;">$foo</span>->getEventManager()->setSharedManager(<span style="color: #800080;">$sharedEvents</span><span style="color: #000000;">); </span><span style="color: #800080;">$foo</span>->bar('bar', 'bat');
Am Ende des Codes lösen wir das Bar-Ereignis aus, das dann das obige Ereignis auslöst. Die Ergebnisse werden hier nicht beschrieben.
Wenn wir SubFoo verwenden, um die Foo-Klasse zu erben, löst bar() in SubFoo weiterhin unser gemeinsames Ereignis aus. Der Grund dafür ist, dass wir get_class($this) und __CLASS__ gleichzeitig in Foos setIndentifiers() übergeben haben. Wenn wir diese Methode in SubFoo aufrufen, geben diese beiden Parameter SubFoo bzw. Foo zurück (__CLASS__ entspricht get_class() ohne Parameter).