From 4f68c83256350de87be9ebd1eef60db57c7fb76f Mon Sep 17 00:00:00 2001 From: pozhidaev_p Date: Sun, 19 Mar 2023 20:23:17 +0300 Subject: [PATCH] patterns v1 --- .gitignore | 8 ++ README.md | 48 +++++++- code/app.php | 12 ++ code/composer.json | 13 +++ code/composer.lock | 21 ++++ code/src/Actions/Add.php | 19 +++ code/src/Actions/CookAction.php | 26 +++++ code/src/Actions/Fry.php | 18 +++ code/src/Actions/Prepare.php | 26 +++++ code/src/Application/App.php | 63 ++++++++++ code/src/Application/ApplicationHelper.php | 59 ++++++++++ code/src/Application/Conf.php | 32 +++++ code/src/Application/Register.php | 109 ++++++++++++++++++ code/src/Application/Request.php | 56 +++++++++ code/src/Config/options.ini | 15 +++ code/src/Config/recipes.ini | 21 ++++ code/src/Entity/DtoInterface.php | 8 ++ code/src/Entity/IngredientsDto.php | 26 +++++ code/src/Entity/ProductDto.php | 57 +++++++++ code/src/Exceptions/AppException.php | 12 ++ code/src/Exceptions/KitchenException.php | 11 ++ code/src/Exceptions/QualityException.php | 11 ++ code/src/Observers/ProductPublisher.php | 29 +++++ .../Observers/ProductPublisherInterface.php | 12 ++ .../Observers/ProductSubscriberInterface.php | 10 ++ code/src/Products/Burger.php | 8 ++ code/src/Products/BurgerFactory.php | 13 +++ code/src/Products/Hotdog.php | 8 ++ code/src/Products/HotdogFactory.php | 13 +++ code/src/Products/Product.php | 61 ++++++++++ code/src/Products/ProductFactoryInterface.php | 15 +++ code/src/Products/ProductInterface.php | 8 ++ code/src/Products/Sandwich.php | 8 ++ code/src/Products/SandwichFactory.php | 11 ++ code/src/Recipes/BurgerRecipe.php | 8 ++ code/src/Recipes/HotdogRecipe.php | 8 ++ code/src/Recipes/Recipe.php | 74 ++++++++++++ code/src/Recipes/RecipeStrategyInterface.php | 10 ++ code/src/Recipes/SandwichRecipe.php | 8 ++ code/src/Services/HallDisplay.php | 21 ++++ code/src/Services/Kitchen.php | 43 +++++++ .../Services/KitchenWithQualityControl.php | 52 +++++++++ code/src/Services/MenuBook.php | 39 +++++++ code/src/Services/Order.php | 33 ++++++ docker-compose.yaml | 13 +++ fpm/Dockerfile | 7 ++ results/results.png | Bin 0 -> 74218 bytes 47 files changed, 1182 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 code/app.php create mode 100644 code/composer.json create mode 100644 code/composer.lock create mode 100644 code/src/Actions/Add.php create mode 100644 code/src/Actions/CookAction.php create mode 100644 code/src/Actions/Fry.php create mode 100644 code/src/Actions/Prepare.php create mode 100644 code/src/Application/App.php create mode 100644 code/src/Application/ApplicationHelper.php create mode 100644 code/src/Application/Conf.php create mode 100644 code/src/Application/Register.php create mode 100644 code/src/Application/Request.php create mode 100644 code/src/Config/options.ini create mode 100644 code/src/Config/recipes.ini create mode 100644 code/src/Entity/DtoInterface.php create mode 100644 code/src/Entity/IngredientsDto.php create mode 100644 code/src/Entity/ProductDto.php create mode 100644 code/src/Exceptions/AppException.php create mode 100644 code/src/Exceptions/KitchenException.php create mode 100644 code/src/Exceptions/QualityException.php create mode 100644 code/src/Observers/ProductPublisher.php create mode 100644 code/src/Observers/ProductPublisherInterface.php create mode 100644 code/src/Observers/ProductSubscriberInterface.php create mode 100644 code/src/Products/Burger.php create mode 100644 code/src/Products/BurgerFactory.php create mode 100644 code/src/Products/Hotdog.php create mode 100644 code/src/Products/HotdogFactory.php create mode 100644 code/src/Products/Product.php create mode 100644 code/src/Products/ProductFactoryInterface.php create mode 100644 code/src/Products/ProductInterface.php create mode 100644 code/src/Products/Sandwich.php create mode 100644 code/src/Products/SandwichFactory.php create mode 100644 code/src/Recipes/BurgerRecipe.php create mode 100644 code/src/Recipes/HotdogRecipe.php create mode 100644 code/src/Recipes/Recipe.php create mode 100644 code/src/Recipes/RecipeStrategyInterface.php create mode 100644 code/src/Recipes/SandwichRecipe.php create mode 100644 code/src/Services/HallDisplay.php create mode 100644 code/src/Services/Kitchen.php create mode 100644 code/src/Services/KitchenWithQualityControl.php create mode 100644 code/src/Services/MenuBook.php create mode 100644 code/src/Services/Order.php create mode 100644 docker-compose.yaml create mode 100644 fpm/Dockerfile create mode 100644 results/results.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..2def84fb5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +composer.phar +/code/vendor +/app +/.idea/ +/db*/ +/*.env +/app/public/logs +/rabbitmq \ No newline at end of file diff --git a/README.md b/README.md index ba7ebff27..6505d81ac 100644 --- a/README.md +++ b/README.md @@ -1 +1,47 @@ -# PHP_2022 \ No newline at end of file +# PHP_2022 +### Design Patterns + +--- +##### Описание +- Фабричный метод - (Products) - генерирует заказанный продукт +- Цепочка обязанностей - Операции(Actions) - добавляют ингредиенты согласно рецепту и пожеланиям заказчика +- Стратегия - Рецепты(Recipes) - определяет порядок приготовления +- Наблюдатель - Монитор в зале(HallDisplay) - выводит статус приготовления +- Прокси - (KitchenWithQualityControl) - расширяет класс Kitchen, добавляет функционал проверки качества продукта + + +###### Порядок запуска +Установить необходимые пакеты§ +```bash +composer install +``` +Собрать и запустить докер +```bash +docker compose up -d --build +``` + +Запустить в консоли обработчик запросов +```bash +docker exec -it fast-food sh +``` + +Сделать заказ +```bash +php app.php -p burger +``` +Сделать заказ и убрать ингредиенты +```bash +php app.php -p burger -e onion +``` + +--- +##### Задание +Разрабатываем часть интернет-ресторана. Продаёт он фаст-фуд. + +1. Фабричный метод будет отвечать за генерацию базового продукта-прототипа, из которого будут готовиться: бургер, сэндвич или хот-дог +2. При готовке каждого типа продукта Цепочка обязанностей будет добавлять составляющие к базовому продукту либо по рецепту, либо по пожеланию клиента (салат, лук, перец и т.д.) +3. Наблюдатель подписывается на статус приготовления и отправляет оповещения о том, что изменился статус приготовления продукта. +4. Прокси используется для навешивания пре и пост событий на процесс готовки. Например, если бургер не соответствует стандарту, пост событие утилизирует его. +5. Стратегия будет отвечать за то, что нужно приготовить. + +Все сущности должны по максимуму генерироваться через DI. diff --git a/code/app.php b/code/app.php new file mode 100644 index 000000000..d5e66a8d7 --- /dev/null +++ b/code/app.php @@ -0,0 +1,12 @@ +run(); +} +catch(\Exception $e){ + echo $e->getMessage(); +} \ No newline at end of file diff --git a/code/composer.json b/code/composer.json new file mode 100644 index 000000000..0bb8e869b --- /dev/null +++ b/code/composer.json @@ -0,0 +1,13 @@ +{ + "name": "ppro/hw20", + "autoload": { + "psr-4": { + "Ppro\\Hw20\\": "src/" + } + }, + "config": { + "platform": { + "php": "8.1" + } + } +} diff --git a/code/composer.lock b/code/composer.lock new file mode 100644 index 000000000..8f5987920 --- /dev/null +++ b/code/composer.lock @@ -0,0 +1,21 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "3a0047c5150f0c0d96cfdd8303e54b94", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "platform-overrides": { + "php": "8.1" + }, + "plugin-api-version": "2.3.0" +} diff --git a/code/src/Actions/Add.php b/code/src/Actions/Add.php new file mode 100644 index 000000000..0f4b9c271 --- /dev/null +++ b/code/src/Actions/Add.php @@ -0,0 +1,19 @@ +getProductObject()->setFinishedProduct(array_merge($product->getProductObject()->getFinishedProduct(),$this->ingredient)); + parent::handle($product); + } +} \ No newline at end of file diff --git a/code/src/Actions/CookAction.php b/code/src/Actions/CookAction.php new file mode 100644 index 000000000..b84ff00fc --- /dev/null +++ b/code/src/Actions/CookAction.php @@ -0,0 +1,26 @@ +nextAction = $action; + return $action; + } + + public function handle(ProductInterface $product): void + { + if ($this->nextAction !== null) { + $this->nextAction->handle($product); + } + } +} \ No newline at end of file diff --git a/code/src/Actions/Fry.php b/code/src/Actions/Fry.php new file mode 100644 index 000000000..94d3e3bef --- /dev/null +++ b/code/src/Actions/Fry.php @@ -0,0 +1,18 @@ +ingredient,fn(&$ingredient,$key,$operation):string => $ingredient = $operation.$ingredient,'Fried '); + $product->getProductObject()->setFinishedProduct(array_merge($product->getProductObject()->getFinishedProduct(),$this->ingredient)); + parent::handle($product); + } +} \ No newline at end of file diff --git a/code/src/Actions/Prepare.php b/code/src/Actions/Prepare.php new file mode 100644 index 000000000..7a2c87c19 --- /dev/null +++ b/code/src/Actions/Prepare.php @@ -0,0 +1,26 @@ +checkIngredientsAvailability($this->ingredient); + parent::handle($product); + } + + private function checkIngredientsAvailability(array $ingredients) + { + //... проверка наличия ингредиентов + $available = true; + if(!$available) + throw new KitchenException("Ingredient does not exist"); + } +} \ No newline at end of file diff --git a/code/src/Application/App.php b/code/src/Application/App.php new file mode 100644 index 000000000..e790fc37e --- /dev/null +++ b/code/src/Application/App.php @@ -0,0 +1,63 @@ +reg = Register::instance(); + } + + /** + * @return void + * @throws AppException + */ + public function run() + { + $this->init(); + $this->handleRequest(); + } + + /** + * @return void + */ + private function init() + { + $this->reg->getApplicationHelper()->init(); + } + + /** + * @return void + * @throws AppException + */ + private function handleRequest() + { + $orderCmd = ($this->reg->getRequest())->getOrder(); + if(empty($orderCmd)) + throw new AppException('Command is empty'); + $orderSets = ($this->reg->getRequest())->getSets(); + $recipeClass = Register::instance()->getRecipe($orderCmd); + $productClass = Register::instance()->getProduct($orderCmd); + $recipeSteps = Register::instance()->getRecipeSteps()->getAll()[$orderCmd] ?? []; + + $order = new Order(); + $order->make($recipeClass, $productClass, $recipeSteps, $orderSets); + } + + + + + +} \ No newline at end of file diff --git a/code/src/Application/ApplicationHelper.php b/code/src/Application/ApplicationHelper.php new file mode 100644 index 000000000..1927e5751 --- /dev/null +++ b/code/src/Application/ApplicationHelper.php @@ -0,0 +1,59 @@ +reg = Register::instance(); + } + + public function init() + { + $this->setupOptions(); + + $request = Request::getInstance(); + $this->reg->setRequest($request); + } + + /** Обработка конфигурационных файлов приложения + * @return void + * @throws AppException + */ + private function setupOptions() + { + if (! file_exists($this->config)) { + throw new AppException("Could not find options file"); + } + + $options = parse_ini_file($this->config, true); + $recipe = new Conf($options['recipe']); + + $this->reg->setRecipes($recipe); + $product = new Conf($options['product']); + $this->reg->setProducts($product); + + if (! file_exists($this->recipesConfig)) { + throw new AppException("Could not find recipes file"); + } + + $recipesConfigArray = parse_ini_file($this->recipesConfig, true); + $recipeSteps = new Conf($recipesConfigArray); + $this->reg->setRecipeSteps($recipeSteps); + + } +} diff --git a/code/src/Application/Conf.php b/code/src/Application/Conf.php new file mode 100644 index 000000000..13a7bad88 --- /dev/null +++ b/code/src/Application/Conf.php @@ -0,0 +1,32 @@ +vals = $vals; + } + + public function get(string $key) + { + if (isset($this->vals[$key])) { + return $this->vals[$key]; + } + return null; + } + + public function set(string $key, $val) + { + $this->vals[$key] = $val; + } + + public function getAll(): array + { + return $this->vals; + } +} diff --git a/code/src/Application/Register.php b/code/src/Application/Register.php new file mode 100644 index 000000000..d9c7e872f --- /dev/null +++ b/code/src/Application/Register.php @@ -0,0 +1,109 @@ +applicationHelper)) { + $this->applicationHelper = new ApplicationHelper(); + } + + return $this->applicationHelper; + } + + public static function reset(): void + { + self::$instance = null; + } + + /** + * @param Request $request + */ + public function setRequest(Request $request): void + { + $this->request = $request; + } + + /** + * @return Request + */ + public function getRequest(): Request + { + return $this->request; + } + + /** + * @param Conf $recipe + */ + public function setRecipes(Conf $recipe): void + { + $this->recipe = $recipe; + } + + /** + * @return Conf + */ + public function getRecipes(): Conf + { + return $this->recipe; + } + public function getRecipe(string $name): string + { + return $this->recipe->get($name) ?? ''; + } + + /** + * @param Conf $recipe + */ + public function setProducts(Conf $product): void + { + $this->product = $product; + } + + /** + * @return Conf + */ + public function getProducts(): Conf + { + return $this->product; + } + public function getProduct(string $name): string + { + return $this->product->get($name) ?? ''; + } + + public function setRecipeSteps(Conf $recipeSteps) + { + $this->recipeSteps = $recipeSteps; + } + public function getRecipeSteps(): Conf + { + return $this->recipeSteps; + } + +} \ No newline at end of file diff --git a/code/src/Application/Request.php b/code/src/Application/Request.php new file mode 100644 index 000000000..edac85f4a --- /dev/null +++ b/code/src/Application/Request.php @@ -0,0 +1,56 @@ +init(); + } + + /** + * @return static + */ + public static function getInstance(): self + { + if (is_null(self::$instance)) + self::$instance = new self(); + return self::$instance; + } + + /** + * @return void + */ + private function init() + { + $opts = getopt('p:e:'); + $this->order = $opts['p'] ?? ''; + $this->sets = isset($opts['e']) ? (is_array($opts['e']) ? $opts['e'] : [$opts['e']]) : []; + + } + + public function getOrder(): string + { + return $this->order; + } + + /** + * @return array + */ + public function getSets(): array + { + return $this->sets; + } +} \ No newline at end of file diff --git a/code/src/Config/options.ini b/code/src/Config/options.ini new file mode 100644 index 000000000..3c8924040 --- /dev/null +++ b/code/src/Config/options.ini @@ -0,0 +1,15 @@ +[recipe] +burger=Ppro\Hw20\Recipes\BurgerRecipe +bigburger=Ppro\Hw20\Recipes\BigBurgerRecipe +superburger=Ppro\Hw20\Recipes\SuperBurgerRecipe +hotdog=Ppro\Hw20\Recipes\HotDogRecipe +spicyhotdog=Ppro\Hw20\Recipes\SpicyHotDogRecipe +sandwich=Ppro\Hw20\Recipes\SandwichRecipe + +[product] +burger=Ppro\Hw20\Products\BurgerFactory +bigburger=Ppro\Hw20\Products\BurgerFactory +superburger=Ppro\Hw20\Products\BurgerFactory +hotdog=Ppro\Hw20\Products\HotDogFactory +spicyhotdog=Ppro\Hw20\Products\HotDogFactory +sandwich=Ppro\Hw20\Products\SandwichFactory \ No newline at end of file diff --git a/code/src/Config/recipes.ini b/code/src/Config/recipes.ini new file mode 100644 index 000000000..5cde59c2d --- /dev/null +++ b/code/src/Config/recipes.ini @@ -0,0 +1,21 @@ +[burger] +step1=bun,\Ppro\Hw20\Actions\Add +step2=sauce,\Ppro\Hw20\Actions\Add +step3=salad,\Ppro\Hw20\Actions\Add +step4=onion,\Ppro\Hw20\Actions\Add +step5=cutlet,\Ppro\Hw20\Actions\Fry +step6=salad,\Ppro\Hw20\Actions\Add +step7=bun,\Ppro\Hw20\Actions\Add + +[sandwich] +step1=bread,\Ppro\Hw20\Actions\Add +step2=sauce,\Ppro\Hw20\Actions\Add +step3=salad,\Ppro\Hw20\Actions\Add +step4=ham,\Ppro\Hw20\Actions\Add +step5=bread,\Ppro\Hw20\Actions\Add + +[hotdog] +step1=bun,\Ppro\Hw20\Actions\Add +step2=sauce,\Ppro\Hw20\Actions\Add +step3=salad,\Ppro\Hw20\Actions\Add +step4=sausage,\Ppro\Hw20\Actions\Fry \ No newline at end of file diff --git a/code/src/Entity/DtoInterface.php b/code/src/Entity/DtoInterface.php new file mode 100644 index 000000000..fce67d41f --- /dev/null +++ b/code/src/Entity/DtoInterface.php @@ -0,0 +1,8 @@ +ingredients = $ingredients; + } + + + public function getIngredients(array $ingredients): array + { + return $this->ingredients; + } + +} \ No newline at end of file diff --git a/code/src/Entity/ProductDto.php b/code/src/Entity/ProductDto.php new file mode 100644 index 000000000..ab73a8715 --- /dev/null +++ b/code/src/Entity/ProductDto.php @@ -0,0 +1,57 @@ +finishedProduct; + } + + /** + * @param array $finishedProduct + */ + public function setFinishedProduct(array $finishedProduct): void + { + $this->finishedProduct = $finishedProduct; + } + + /** + * @param string $status + */ + public function setStatus(string $status): void + { + $this->status = $status; + } + + public function getStatus(): string + { + return $this->status; + } + + private function getProductInfo(): array + { + return [ + 'PRODUCT' => $this->finishedProduct, + ]; + } + + public function getProductInfoJson() + { + return json_encode($this->getProductInfo()); + } + + public function utilize() + { + $this->finishedProduct = []; + } + +} \ No newline at end of file diff --git a/code/src/Exceptions/AppException.php b/code/src/Exceptions/AppException.php new file mode 100644 index 000000000..68be1de21 --- /dev/null +++ b/code/src/Exceptions/AppException.php @@ -0,0 +1,12 @@ +subscribers[] = $subscriber; + } + + public function unsubscribe(ProductSubscriberInterface $subscriber) + { + // TODO: Implement unsubscribe() method. + } + + public function notify(ProductInterface $product) + { + foreach ($this->subscribers as $subscriber) { + $subscriber->update($product); + } + } +} \ No newline at end of file diff --git a/code/src/Observers/ProductPublisherInterface.php b/code/src/Observers/ProductPublisherInterface.php new file mode 100644 index 000000000..fe9a81abc --- /dev/null +++ b/code/src/Observers/ProductPublisherInterface.php @@ -0,0 +1,12 @@ +product = new ProductDto(); + } + + /** + * @return ProductDto + */ + public function getProductObject(): ProductDto + { + return $this->product; + } + + /** + * @param CookAction $cookAction + * @return void + */ + public function productCook(CookAction $cookAction): void + { + $cookAction->handle($this); + } + + /** + * @param string $status + * @return void + */ + public function setStatus(string $status): void + { + $this->product->setStatus($status); + $this->notify($this); + } + + /** + * @return void + */ + public function utilizeProduct() + { + $this->product->utilize(); + } +} \ No newline at end of file diff --git a/code/src/Products/ProductFactoryInterface.php b/code/src/Products/ProductFactoryInterface.php new file mode 100644 index 000000000..3979413ca --- /dev/null +++ b/code/src/Products/ProductFactoryInterface.php @@ -0,0 +1,15 @@ +recipeSteps,function(&$step){$step = explode(",",$step);}); + $this->ingredients = new IngredientsDto(); + $this->ingredients->setIngredients($this->getIngredientsArray()); + } + + /** + * @return ProductFactoryInterface + */ + public function getProductFactory(): ProductFactoryInterface + { + return $this->productFactory; + } + + /** + * @return IngredientsDto + */ + public function getIngredients(): IngredientsDto + { + return $this->ingredients; + } + + /** + * @return array + */ + public function getIngredientsArray(): array + { + return array_map(fn($item):string => reset($item),$this->getRecipeByStep()); + } + + /** + * @return array + */ + private function getRecipeByStep() + { + return array_filter($this->recipeSteps,fn($recipeItem)=>!in_array(reset($recipeItem),$this->orderSets)); + } + + /** Формирование цепочки обязанностей (последовательность приготовления) + * @return CookAction + */ + public function getProcess(): CookAction + { + $firstHandler = new Prepare($this->getIngredientsArray()); + $process = $this->getRecipeByStep(); + array_reduce($process,function($currentHandler,$processItem){ + list($ingredient,$action) = $processItem; + return $currentHandler->setNextAction(new $action([$ingredient])); + },$firstHandler); + return $firstHandler; + } +} \ No newline at end of file diff --git a/code/src/Recipes/RecipeStrategyInterface.php b/code/src/Recipes/RecipeStrategyInterface.php new file mode 100644 index 000000000..cc6859d05 --- /dev/null +++ b/code/src/Recipes/RecipeStrategyInterface.php @@ -0,0 +1,10 @@ +getProductObject()->getStatus(); + } +} \ No newline at end of file diff --git a/code/src/Services/Kitchen.php b/code/src/Services/Kitchen.php new file mode 100644 index 000000000..929ad9a8f --- /dev/null +++ b/code/src/Services/Kitchen.php @@ -0,0 +1,43 @@ +product = (new ($this->recipe->getProductFactory()))->create(); + } + + /** Приготовление продукта + * @return void + */ + public function productCook() + { + $this->product->setStatus('The kitchen has started cooking'.PHP_EOL); + $this->product->productCook($this->recipe->getProcess()); + $this->product->setStatus('The kitchen has finished cooking'.PHP_EOL); + } + + /** + * @return ProductInterface + */ + public function getProduct() + { + return $this->product; + } +} \ No newline at end of file diff --git a/code/src/Services/KitchenWithQualityControl.php b/code/src/Services/KitchenWithQualityControl.php new file mode 100644 index 000000000..d92459afd --- /dev/null +++ b/code/src/Services/KitchenWithQualityControl.php @@ -0,0 +1,52 @@ +product->setStatus('The kitchen has started cooking'.PHP_EOL); + $this->product->productCook($this->recipe->getProcess()); + try { + $this->checkProductQuality(); + } catch (QualityException $e){ + //.. remake product or ... + echo $e->getMessage(); + if($this->retryCount++ > 2) + throw new KitchenException('The chef is not at his best today'); + $this->product->utilizeProduct(); + $this->productCook(); + return; + } + $this->product->setStatus('The kitchen has finished cooking'.PHP_EOL); + } + + /** + * @return void + * @throws QualityException + */ + private function checkProductQuality() + { + //... + //проверка качества продукта + $quality = rand(90,100) > 95; + if($quality) + throw new QualityException('Product quality must be up to 95'.PHP_EOL); + } +} \ No newline at end of file diff --git a/code/src/Services/MenuBook.php b/code/src/Services/MenuBook.php new file mode 100644 index 000000000..c78d9e483 --- /dev/null +++ b/code/src/Services/MenuBook.php @@ -0,0 +1,39 @@ +product = new $productClass(); + if(empty($recipeSteps)) + throw new AppException('RecipeSteps not found'); + $this->recipe = new $recipeClass($this->product, $recipeSteps, $this->orderSets); + + } + + public function getRecipe(): RecipeStrategyInterface + { + return $this->recipe; + } + + public function getReadyProduct(): ProductFactoryInterface + { + return $this->product; + } +} \ No newline at end of file diff --git a/code/src/Services/Order.php b/code/src/Services/Order.php new file mode 100644 index 000000000..c1265cc04 --- /dev/null +++ b/code/src/Services/Order.php @@ -0,0 +1,33 @@ +getRecipe()); + $kitchen->getProduct()->subscribe(new HallDisplay()); + $kitchen->productCook(); + echo $kitchen->getProduct()->getProductObject()->getProductInfoJson().PHP_EOL; + } catch (KitchenException|AppException $e) { + echo $e->getMessage(); + } + } +} \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 000000000..aee0498af --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,13 @@ +version: '3' + +services: + #Контейнер с PHP-FPM + app: + build: + context: ./fpm + dockerfile: Dockerfile + image: myapp/php + container_name: fast-food + volumes: + - ./code:/data + diff --git a/fpm/Dockerfile b/fpm/Dockerfile new file mode 100644 index 000000000..9e0f79a23 --- /dev/null +++ b/fpm/Dockerfile @@ -0,0 +1,7 @@ +FROM php:8.1-fpm + +WORKDIR /data + +VOLUME /data + +CMD ["php-fpm"] diff --git a/results/results.png b/results/results.png new file mode 100644 index 0000000000000000000000000000000000000000..8eec60c49f9d9044a8e25ebf5eb51019fe00423c GIT binary patch literal 74218 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�e@m}$xmhVc`3^V^ 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 literal 0 HcmV?d00001