Heim > php教程 > php手册 > Hauptteil

zendframework Eventmanagement (1)

WBOY
Freigeben: 2016-08-04 08:53:14
Original
1169 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
Der zweite Parameter von

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>
Nach dem Login kopieren

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');
Nach dem Login kopieren

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).

 

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage