Automation¶
Im Beispiel Arbeiten mit Übergängen wurde ein komplexer 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.
Events werden an verschiedenen Stellen gefeuert.
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:
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
ausgegeben.
/** 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();