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.
Cloner le projet sur GitHub
Projet sous licence open source! Hébergé, développé et maintenu sur GitHub.
Voir le projet sur GitHub
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;