From dabbf541dc0ab2f0141a677d2eeef26fa022e3c4 Mon Sep 17 00:00:00 2001 From: Yevhen Odynets Date: Fri, 4 Jul 2025 13:35:51 +0300 Subject: [PATCH] Add Litlab --- Dockerfile | 3 +++ code/decorator.php | 12 ++++++++++ code/prototype.php | 2 +- code/singleton.php | 5 ++-- composer.json | 3 +-- composer.lock | 7 ++++-- public/assets/img/diagrams/prototype.png | Bin 0 -> 8155 bytes public/assets/img/diagrams/singleton.png | Bin 0 -> 12298 bytes public/index.php | 17 +++++++------- .../Structural/Decorator/BorderDecorator.php | 22 ++++++++++++++++++ src/Pattern/Structural/Decorator/Circle.php | 20 ++++++++++++++++ .../Structural/Decorator/EmailDecorator.php | 22 ++++++++++++++++++ .../Structural/Decorator/ShapeInterface.php | 17 ++++++++++++++ .../Structural/Decorator/SmileDecorator.php | 22 ++++++++++++++++++ src/Pattern/Structural/Decorator/Square.php | 20 ++++++++++++++++ .../patterns_examples/singleton}/Loggable.php | 2 +- .../patterns_examples/singleton}/Logger.php | 2 +- 17 files changed, 159 insertions(+), 17 deletions(-) create mode 100644 Dockerfile create mode 100644 code/decorator.php create mode 100644 public/assets/img/diagrams/prototype.png create mode 100644 public/assets/img/diagrams/singleton.png create mode 100644 src/Pattern/Structural/Decorator/BorderDecorator.php create mode 100644 src/Pattern/Structural/Decorator/Circle.php create mode 100644 src/Pattern/Structural/Decorator/EmailDecorator.php create mode 100644 src/Pattern/Structural/Decorator/ShapeInterface.php create mode 100644 src/Pattern/Structural/Decorator/SmileDecorator.php create mode 100644 src/Pattern/Structural/Decorator/Square.php rename {src/Pattern/Creational/Singleton => storage/patterns_examples/singleton}/Loggable.php (78%) rename {src/Pattern/Creational/Singleton => storage/patterns_examples/singleton}/Logger.php (98%) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..874d226 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +FROM php:8.3-cli-alpine3.22 + +ENTRYPOINT ["php", "-S", "localhost:8008", "-t", "public/"] \ No newline at end of file diff --git a/code/decorator.php b/code/decorator.php new file mode 100644 index 0000000..ae4e1ec --- /dev/null +++ b/code/decorator.php @@ -0,0 +1,12 @@ +Adapter DEsign Pattern Diagram trace(), @@ -36,7 +36,8 @@ function clientCode(): void dump($output, $output['s1']->getValue(), $output['s2']->getValue()); } -clientCode(); +?>Adapter DEsign Pattern DiagramsetValue('value set from Single::class')->childish(); diff --git a/composer.json b/composer.json index d2c834f..f3b6eaa 100644 --- a/composer.json +++ b/composer.json @@ -13,8 +13,7 @@ ], "require": { "php": "8.3.*", - "ext-simplexml": "*", - "ext-yaml": "*" + "ext-simplexml": "*" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.76" diff --git a/composer.lock b/composer.lock index f80d22f..33e17b1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8d4ed5a63e8da7821980256ec54097f7", + "content-hash": "15fcc4c375fa23daddd63652d90fdeab", "packages": [], "packages-dev": [ { @@ -2544,7 +2544,10 @@ "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, - "platform": {}, + "platform": { + "php": "8.3.*", + "ext-simplexml": "*" + }, "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/public/assets/img/diagrams/prototype.png b/public/assets/img/diagrams/prototype.png new file mode 100644 index 0000000000000000000000000000000000000000..dead9b3ab4838186f588d45a292945e490467136 GIT binary patch literal 8155 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 literal 0 HcmV?d00001 diff --git a/public/assets/img/diagrams/singleton.png b/public/assets/img/diagrams/singleton.png new file mode 100644 index 0000000000000000000000000000000000000000..f353122913387caca6ce47231e6dc2b42d81e74f GIT binary patch literal 12298 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, #eef0f0); + background-color: attr(data-color type(< color >), #eef0f0); } pre, code { font-family: Consolas, monospace; font-size: 1.125rem; } + pre { align-self: center; } img.diagram { + display: block; max-width: 100%; + margin: 0 auto 1rem; } .et { position: absolute; - top: .5rem; - left: .5rem; + bottom: .5rem; + right: .5rem; font-size: small; font-weight: 500; color: #333; @@ -68,12 +71,10 @@ require '../src/helpers.php';
- +
ET: secs
- - - - + \ No newline at end of file diff --git a/src/Pattern/Structural/Decorator/BorderDecorator.php b/src/Pattern/Structural/Decorator/BorderDecorator.php new file mode 100644 index 0000000..b679bf9 --- /dev/null +++ b/src/Pattern/Structural/Decorator/BorderDecorator.php @@ -0,0 +1,22 @@ +'; + } +} \ No newline at end of file diff --git a/src/Pattern/Structural/Decorator/Circle.php b/src/Pattern/Structural/Decorator/Circle.php new file mode 100644 index 0000000..6bb7562 --- /dev/null +++ b/src/Pattern/Structural/Decorator/Circle.php @@ -0,0 +1,20 @@ +