Automation

Im Beispiel Arbeiten mit Übergängen wurde ein kompleter Ablauf eines Containers mit verschiedenen Übergängen zwischen den Status beschrieben. Für einen Übergang von einem Zustand zu einem anderen Zustand muss immer die Methode \Alvine\Application\Workflow\Processor::run() aufgerufen werden.

Möchte man allerdings auf das Erstellen eines neuen Container reagieren, so könnte man im Admission-Objekt bestimmte Dinge regeln. Der Nachteil ist die Verzahnung der Erstellung des Containers mit den Aktionen die auf die Erstellung ausgeführt werden sollen.

Hier kommen die Events ins Spiel.

Ein Event ist eine von \Alvine\Application\Workflow\Event abgeleitete Klasse. Es wird an verschiedenen Stellen im Workflow gefeuert und an alle \Alvine\Core\Event\Subscriber übergeben.

Wir nehmen das Beispiel aus Arbeiten mit Übergängen und definieren zwei unterschiedliche Container-Objekte: Item1 und Item2.

Der Ablauf des Programms ist im Groben wie folgt:

uml diagram

class ItemA implements \Alvine\Application\Workflow\Container {

    use \Alvine\Application\Workflow\Container\Implementation;
}

class ItemB implements \Alvine\Application\Workflow\Container {

    use \Alvine\Application\Workflow\Container\Implementation;
}

Nun soll eine neue Regel erstellt werden. Diese soll eine Ausgabe beim Erstellen von Containern vom Typ ItemA machen.

/** Neue Regel erstellen */
$rule=new \Alvine\Application\Workflow\Automation\Rule($workflow, 
    \Alvine\Application\Workflow\Event\Created::class);

$rule->appendCondition(new class() extends \Alvine\Core\Alvine 
    implements \Alvine\Application\Workflow\Automation\Condition {

    /** Überprüfung um nur auf ItemA zu reagieren */
    public function validate(\Alvine\Core\Event\Event $event): bool {
        if($event->getPayload() instanceof \MyNamespace\ItemA) {
            return true;
        }
        return false;
    }
});

$rule->appendAction(new class() extends \Alvine\Core\Alvine 
    implements \Alvine\Application\Workflow\Automation\Action {

    /** Ausführen der Regel */
    public function execute(\Alvine\Application\Workflow\Automation\Rule $rule, 
        \Alvine\Application\Workflow\Event $event): 
        \Alvine\Application\Workflow\Automation\Action {

        echo "EXECUTED: ".\get_class($event->getPayload());
        return $this;
    }
});

/** Regel in den Workflow integrieren */
$workflow->attach
    (new \Alvine\Application\Workflow\Automation\Subscriber($rule));

Nun wird ein Container vom Typ ItemA erstellt, die Regel kommt zum Tragen und es wird EXECUTED: MyNamespace\ItemA ausgebeben.

/** Ersteller-Klasse; Neue Container vom Type Item im Status A erstellen */
$workflow->setAdmission
    (new \Alvine\Application\Workflow\Admission(\MyNamespace\ItemA::class, $stateA));
$workflow->create();

Beim Erstellen eines Containers vom Typ ItemB wird die Regel nicht ausgeführt.

/** Ändern der Erstellklasse auf eine Admission, die Container vom Type B erstellt. */
$workflow->setAdmission
    (new \Alvine\Application\Workflow\Admission(\MyNamespace\ItemB::class, $stateA));
$workflow->create();

Events werden an verschiedenen Stellen gefeuert.