Erste Schritte

Nach dem erfolgreichen Download der Phar Archive kann das erste kleine Anwendungsscript erstellt werden. Dazu legen wir die Datei myapp.php an.


include_once '/phar/alvine.framework-snapshot.phar';
include_once '/phar/alvine.application.workflow-snapshot.phar';

Im folgenden ist ein Beispiel aufgeführt.

class Item {

}

$created=new \Alvine\Application\Workflow\State('ERSTELLT');
$start=new \Alvine\Application\Workflow\State('ANFANG');
$middle=new \Alvine\Application\Workflow\State('ZWISCHENSTAND');
$end=new \Alvine\Application\Workflow\State('ENDE');

/**
 * Erste Aktion
 */
/**
 * Erster Schritt anlegen mit der Ersten Aktion
 */
$step=new \Alvine\Application\Workflow\Step('step-1');
$step->addAction
    (new \Alvine\Application\Workflow\Action\Closure(function($container) {
        echo "Action 1 (Schritt 1) \n";
        echo "Item erstellen \n";
        $item=new Item();
        echo "Item in den Container verschieben \n\n";
        $container->setValue('item', $item);
        return $container;
    }));


/**
 * zweite Aktion
 */
/**
 * zweite Aktion dem 1. Schritt zuweisen
 */
$step->addAction
    (new \Alvine\Application\Workflow\Action\Closure(function($container) {
        echo "Action 2 (Schritt 1) \n";
        echo "Item aus dem Container laden \n";
        $item=$container->getValue('item');
        echo "Namen hinzufügen \n\n";
        $item->name='T-Shirt';
        return $container;
    }));


/**
 * dritte Aktion
 */
/**
 * dritte Aktion dem 1. Schritt zuweisen
 */
$step->addAction
    (new \Alvine\Application\Workflow\Action\Closure(function($container) {
        echo "Action 3 (Schritt 1) \n";
        echo "Item aus dem Container laden \n";
        $item=$container->getValue('item');
        echo "Der Name ist nun :".$item->name."\n\n";

        return $container;
    }));


/**
 *  Funktion zum Validieren des Ergebis der Aktion
 */
/**
 * validieren dem 1. Schritt zuweisen
 */
$step->addValidation
    (new \Alvine\Application\Workflow\Step\Validation\Closure(function($container) {
        echo "Ergebnis der Aktionen werden geprüft \n\n";
        return true;
    }));


/*
 *  Eine Aktion erstellen welche die isValid Funktion
 *  des Steps aufruft
 *  Diese Aktion kann den Container Status ändern
 */

/**
 * vierte Aktion dem 1. Schritt zuweisen
 */
$step->addAction
    (new \Alvine\Application\Workflow\Action\Closure(function($container) {
        echo "Action 4 (Schritt 1) \n";
        echo "Aufruf der isValid() Methode des Schrittes \n";
        echo "Letzet Aktion Schritt 1 --------------\n\n";
        return $container;
    }));



/**
 * ersten Übergang erstellen
 */
$transition1=new \Alvine\Application\Workflow\Transition
    (null, $step, $middle, 'Schritt1');

/**
 * neuen Manager mit dem ersten Übergang erstellen
 */
$transisions=new \Alvine\Application\Workflow\Transitions();
$transisions->addTransition($transition1);

/*
 * erste Aktion
 */

/*
 * zweiten Schritt erstellen
 */
$step2=new \Alvine\Application\Workflow\Step('step-2');
$step2->addAction(new \Alvine\Application\Workflow\Action\Closure
    (function($container) {
        echo "Action 1 (Schritt 2) \n";
        echo "Item laden \n";
        $item=$container->getValue('item');
        echo "und weiter bearbeiten \n\n";
        $item->department='Herren';
        return $container;
    }));


/**
 * zweite Aktion
 */
/**
 * zweite Aktion dem 2. Schritt zuweisen
 */
$step2->addAction(new \Alvine\Application\Workflow\Action\Closure
    (function($container) {
        echo "Action 2 (Schritt 2) \n";
        echo "Item laden \n";
        $item=$container->getValue('item');
        echo "Der Name ist nun :".$item->name."\n";
        echo "Das Department ist nun :".$item->department."\n\n";
        echo "Letzet Aktion Schritt 2 --------------\n\n";
        return $container;
    }));


/*
 *  Übergang von Schritt 1 zu Schritt 2
 */
$transition=new \Alvine\Application\Workflow\Transition
    ($middle, $step2, $end, 'Schritt2');

/*
 *  Validierung von Schritt 1 zu Schritt 2
 */
$validation=new class() extends \Alvine\Core\Alvine 
    implements \Alvine\Application\Workflow\Transition\Validation {

    public function isValid(\Alvine\Application\Workflow\Transition $transition,
        \Alvine\Application\Workflow\Container $container): bool {
        return true;
    }
};

$transition->addValidation($validation);
$transisions->addTransition($transition);

$admission=new \Alvine\Application\Workflow\Admission
    (\Alvine\Application\Workflow\Container\Dataset::class, $created);

$processor=(new \Alvine\Application\Workflow\Processor('test'))
    ->setTransitions($transisions)
    ->setAdmission($admission);

$args=null;

$container=(\Alvine\Application\Workflow\Factory::getInstance($args)
    ->build($processor))->current();

/**
 * Container serialisieren
 * (zum Speichern)
 */
$containerString=\serialize($container);

// Container kommt aus der Serialisierung (aus der Speicherung)
$container=\unserialize($containerString);

// Ausführen der Übergänge
$processor->run($container, 'Schritt1');

/**
 * Action 1 (Schritt 1) 
 * Item erstellen 
 * Item in den Container verschieben 
 * 
 * Action 2 (Schritt 1) 
 * Item aus dem Container laden 
 * Namen hinzufügen 
 * 
 * Action 3 (Schritt 1) 
 * Item aus dem Container laden 
 * Der Name ist nun :T-Shirt
 * 
 * Action 4 (Schritt 1) 
 * Aufruf der isValid() Methode des Schrittes 
 * Letzet Aktion Schritt 1 --------------
 */


// Containerdaten ausgeben
echo (string) $container;

/**
 * ID        : 0e31e3ab-9423-4aae-bf8d-e447737e80fe
 * State     : ZWISCHENSTAND
 * item      : Item
 * 
 * ⬤  2019-05-05 17:57:25   test           
 *      ▶ container created
 * ▷  2019-05-05 17:57:25   test                     ⬤ ▬▶ ERSTELLT       
 *      ▶ container state changed from  to ERSTELLT
 * ▷  2019-05-05 17:57:25   test              ERSTELLT ▬▶ ZWISCHENSTAND  
 *      ▶ container state changed from ERSTELLT to ZWISCHENSTAND           Action 1 (Schritt 2) 
 */


// Übhergang 2
$processor->run($container, 'Schritt2');

/**
 * Item laden 
 * und weiter bearbeiten 
 * 
 * Action 2 (Schritt 2) 
 * Item laden 
 * Der Name ist nun :T-Shirt
 * Das Department ist nun :Herren
 * 
 * Letzet Aktion Schritt 2 --------------
 */


// Zur Speicherung serialisieren
$containerString2=\serialize($container);

// Hier serialisieren ....
// Containerdaten ausgeben
echo (string) $container;

/**
 * State     : ENDE
 * item      : Item
 * 
 * ⬤  2019-05-05 17:57:25   test           
 *      ▶ container created
 * ▷  2019-05-05 17:57:25   test                     ⬤ ▬▶ ERSTELLT       
 *      ▶ container state changed from  to ERSTELLT
 * ▷  2019-05-05 17:57:25   test              ERSTELLT ▬▶ ZWISCHENSTAND  
 *      ▶ container state changed from ERSTELLT to ZWISCHENSTAND
 * ▷  2019-05-05 17:57:25   test         ZWISCHENSTAND ▬▶ ENDE           
 *      ▶ container state changed from ZWISCHENSTAND to ENDE   
 */