Recipe flow

Recipe

Inspiré par la cuisine, permet la création de "WorkFlows" dynamiques.


Lier composants entre eux pour implémenter un workflow et résoudre un problème sans avoir à en écrire du code, tout en permettant de le compléter par des modules supplémentaires.

Un workflow créé via une "recipe" est composé de

  • Des ingrédients
  • Transformation automatique des ingrédients
  • Des actions, "cuisinés" dans un saladier ("bowl")
  • Un plat final attendu
  • Persister les recettes dans un livre de cuisine ("cookbook")
  • Possibilité d'utiliser des promises dans les étapes
  • Compatible avec Fiber

La bibliothèque "East Foundation" est basé sur "Recipe" pour gérer le workflow dédié au traitement des requêtes HTTP et permettre aux développeurs de le compléter en ajoutant des middlewares pour support par exemple les sessions ou les traductions..

Fonctionnalités


Vérification des entrées

Afin d'éviter d'éventuelles erreurs durant l'exécution.

Définition dynamique

Créer, compléter et ordonner les tâches au runtime.

Immutable

Chaque modification créée un nouveau workflow.

PSR 11

Compatible avec la PSR-11, livré avec PHP DI.

GitHub


Cloner le projet sur GitHub

Projet sous licence open source! Hébergé, développé et maintenu sur GitHub.


Voir le projet sur GitHub

Patreon


Supporter le projet sur Patreon

Ce projet est logiciel libre et le restera, mais son développement a un coût. Si vous l'appréciez et si vous souhaitez nous aider à le maintenir et à le faire évoluer. N'hésitez pas à nous supporter sur Patreon.


Supporter le p[rojet

Exemple



<?php

declare(strict_types=1);

namespace
Acme;

use
DateTime;
use
DateTimeImmutable;
use
DateTimeZone;
use
Teknoo\Recipe\Dish\DishClass;
use
Teknoo\Recipe\Ingredient\Ingredient;
use
Teknoo\Recipe\Recipe;
use
Teknoo\Recipe\Chef;
use
Teknoo\Recipe\ChefInterface;
use
Teknoo\Recipe\Promise\Promise;
use
Throwable;

require
'vendor/autoload.php';

$recipe = new Recipe();

$recipe = $recipe->require(
new
Ingredient(DateTime::class, 'date'),
);

$recipe = $recipe->cook(
function (
DateTime $date, ChefInterface $chef): void {
$date = $date->setTimezone(new DateTimeZone('UTC'));

$chef->continue(['date' => $date]);
},
'convertToUTC',
);

$recipe = $recipe->cook(
function (
DateTime $date, ChefInterface $chef): void {
$immutable = DateTimeImmutable::createFromMutable($date);

$chef->finish($immutable);
},
'immutableDate',
);

$output = '';
$recipe = $recipe->given(
new
DishClass(
DateTimeImmutable::class,
new
Promise(
function (
DateTimeImmutable $immutable) use (&$output): void {
$output = $immutable->format('Y-m-d H:i:s T');
},
function (
Throwable $error) use (&$output): void {
$output = $error->getMessage();
}
)
)
);

$chef = new Chef;
$chef->read($recipe);
$chef->process([
'date' => new DateTime('2020-06-27 00:00:00', new DateTimeZone('Europe/Paris'))
]);

echo
$output.PHP_EOL;