Ereignisse/Events

Bei einigen Ereignissen, wie z.B. ein neuer Beitrag oder ein neues Thema im Forum, werden Ereignisse/Events ausgelöst.
Als Modul kann man sich als Zuhörer eintragen und dann auf diese Ereignisse reagieren.

Zuhörer für ein Ereignis eintragen

Möchte man erreichen, dass ein Modul über die gesamte Lebenszeit auf ein bestimmtes Ereignis reagiert, kann dies umgesetzt werden indem man in Modules\Discordnotifier\Plugins\AfterDataseLoad folgenden
Code einfügt:

<?php
namespace Modules\Discordnotifier\Plugins;

use Modules\Forum\Config\Config as ForumConfig;

class AfterDatabaseLoad
{
    public function __construct(array $pluginData)
    {
        if (class_exists(ForumConfig::class)) {
            $forum = new \Modules\Discordnotifier\Events\Forum();
            on(ForumConfig::EVENT_ADDPOST_AFTER, [$forum, 'newPost']);
        }
    }
}

Unter \Modules\Discordnotifier\Events\ werden Klassen abgelegt, die entsprechend des Ereignissen benannt werden. In diesem Fall "Forum". In der Klasse "Forum" werden die Funktionen abgelegt, welche bei dem entsprechenden Ereignis ausgeführt werden sollen. Im obigen Beispiel wurde angegeben, dass beim Ereignis "EVENT_ADDPOST_AFTER" die Funktion "newPost" in der Klasse "Forum" aufgerufen wird.

Module hinterlegen ihre Ereignisse/Events in der config-Klasse als Konstanten. Ein Blick in Application\Modules\<Modulkey>\Config\Config.php kann daher nützlich sein.

Es ist sinnvoll vor dem Eintragen eines Zuhörers zu prüfen ob das Modul auf dessen Ereignisse/Events reagiert werden soll vorhanden und in der richtigen Version vorliegt.

Beispiel Forum

$event enthält das Argument, welches beim Auslösen des Ereignisses übergeben wurde. In diesem Beispiel den neuen Beitrag im Forum.

<?php
namespace Modules\Discordnotifier\Events;

class Forum
{
    public function newPost($event)
    {
        // Anweisungen
    }
}

Zuhörer für ein Ereignis entfernen

Falls nicht mehr länger auf ein Ereignis reagiert werden soll, so muss der Zuhörer für das Ereignis entfernt werden.

$forum = new \Modules\Discordnotifier\Events\Forum();
off(ForumConfig::EVENT_ADDPOST_AFTER, [$forumListener, 'newForumPost']);

Alle Zuhörer für "EVENT_ADDPOST_AFTER" entfernen:
off(ForumConfig::EVENT_ADDPOST_AFTER);

Ereignis/Event auslösen

Wenn man selber ein Ereignis/Event auslösen möchte, auf welches andere Module reagieren können, kann man dies wie folgt bewerkstelligen:

<?php
/**
 * @copyright Ilch 2.0
 * @package ilch
 */

namespace Modules\Forum\Controllers;

[...]
use Modules\Forum\Config\Config as ForumConfig;

class Newpost extends \Ilch\Controller\Frontend
{
    public function indexAction()
    {
        [...]
        $postModel = new ForumPostModel;
        [...]

        $this->trigger(ForumConfig::EVENT_ADDPOST_AFTER, ['postModel' => $postModel, 'forum' => $forum, 'category' => $cat, 'topic' => $topic, 'request' => $this->getRequest()]);
        [...]
    }
}

Das Ereignis hat hier den Namen "EVENT_ADDPOST_AFTER". Dem Ereignissen geben wir ein Array mit, welches nützliche Informationen zum Event enthält - in diesem Fall z.B. einen neuen Beitrag im Forum.

Außerhalb der Controller oder Mapper kann ein Ereignis/Event wie folgt ausgelöst werden:

[...]
use Modules\Forum\Config\Config as ForumConfig;
use Ilch\Event as Event;
[...]
trigger(ForumConfig::EVENT_ADDPOST_AFTER, new Event(ForumConfig::EVENT_ADDPOST_AFTER, ['postModel' => $postModel]));
[...]

Ereignisse/Events müssen als Konstanten in der config-Klasse (Application\Modules\<Modulkey>\Config\Config.php) hinterlegt werden. Dies ermöglicht es anderen Modulen alle verfügbaren Ereignisse/Events zu sehen.
Siehe auch: config.php

Namensschema eines Ereignisses

Die Konstanten werden in der Form "EVENT_AKTION_ZEITPUNKT" benannt. Für Zeitpunkt ist aktuell "BEFORE" oder "AFTER" vorgesehen.

Beispiele

EVENT_SAVETOPIC_BEFORE
EVENT_SAVETOPIC_AFTER
EVENT_ADDTOPIC_AFTER
EVENT_SAVEPOST_BEFORE

Das eigentliche Ereignis wird nach dem Schema "modul_aktion_zeitpunkt" benannt.

Beispiele

forum_saveTopic_before
forum_saveTopic_after
forum_addTopic_after
forum_savePost_before

Auszug aus der config.php eines Moduls:

<?php
/**
 * @copyright Ilch 2.0
 * @package ilch
 */

namespace Modules\Forum\Config;

class Config extends \Ilch\Config\Install
{
    const EVENT_SAVETOPIC_BEFORE = 'forum_saveTopic_before';
    const EVENT_SAVETOPIC_AFTER = 'forum_saveTopic_after';
    const EVENT_ADDTOPIC_AFTER = 'forum_addTopic_after';
    const EVENT_SAVEPOST_BEFORE = 'forum_savePost_before';
    const EVENT_SAVEPOST_AFTER = 'forum_savePost_after';
    const EVENT_ADDPOST_AFTER = 'forum_addPost_after';
    const EVENT_DELETEPOST_BEFORE = 'forum_deletePost_before';
    const EVENT_DELETEPOST_AFTER = 'forum_deletePost_after';
    const EVENT_DELETETOPIC_BEFORE = 'forum_deleteTopic_before';
    const EVENT_DELETETOPIC_AFTER = 'forum_deleteTopic_after';
    [...]

Weiterführende Informationen

https://github.com/sphido/events
https://de.wikipedia.org/wiki/Ereignis_(Programmierung)