From ebbcc6e7f6fce22e2d8583c663c47ac56efb0bc0 Mon Sep 17 00:00:00 2001 From: lubiana Date: Tue, 31 May 2022 17:49:17 +0200 Subject: [PATCH] add chapter 12 solutions --- implementation/12/composer.json | 51 + implementation/12/composer.lock | 1516 +++++++++++++++++ implementation/12/config/container.php | 38 + implementation/12/config/routes.php | 12 + implementation/12/config/settings.php | 5 + implementation/12/ecs.php | 89 + implementation/12/phpstan-baseline.neon | 6 + implementation/12/phpstan.neon | 8 + implementation/12/public/favicon.ico | Bin 0 -> 15086 bytes implementation/12/public/index.php | 3 + implementation/12/rector.php | 12 + implementation/12/src/Action/Hello.php | 31 + implementation/12/src/Action/Other.php | 24 + implementation/12/src/Bootstrap.php | 109 ++ implementation/12/src/Configuration.php | 14 + .../12/src/Exception/InternalServerError.php | 9 + .../12/src/Exception/MethodNotAllowed.php | 9 + implementation/12/src/Exception/NotFound.php | 9 + implementation/12/src/Service/Time/Clock.php | 10 + .../12/src/Service/Time/SystemClock.php | 13 + .../12/src/Template/MustacheRenderer.php | 17 + implementation/12/src/Template/Renderer.php | 11 + implementation/12/templates/hello.html | 2 + 23 files changed, 1998 insertions(+) create mode 100644 implementation/12/composer.json create mode 100644 implementation/12/composer.lock create mode 100644 implementation/12/config/container.php create mode 100644 implementation/12/config/routes.php create mode 100644 implementation/12/config/settings.php create mode 100644 implementation/12/ecs.php create mode 100644 implementation/12/phpstan-baseline.neon create mode 100644 implementation/12/phpstan.neon create mode 100644 implementation/12/public/favicon.ico create mode 100644 implementation/12/public/index.php create mode 100644 implementation/12/rector.php create mode 100644 implementation/12/src/Action/Hello.php create mode 100644 implementation/12/src/Action/Other.php create mode 100644 implementation/12/src/Bootstrap.php create mode 100644 implementation/12/src/Configuration.php create mode 100644 implementation/12/src/Exception/InternalServerError.php create mode 100644 implementation/12/src/Exception/MethodNotAllowed.php create mode 100644 implementation/12/src/Exception/NotFound.php create mode 100644 implementation/12/src/Service/Time/Clock.php create mode 100644 implementation/12/src/Service/Time/SystemClock.php create mode 100644 implementation/12/src/Template/MustacheRenderer.php create mode 100644 implementation/12/src/Template/Renderer.php create mode 100644 implementation/12/templates/hello.html diff --git a/implementation/12/composer.json b/implementation/12/composer.json new file mode 100644 index 0000000..c0fe924 --- /dev/null +++ b/implementation/12/composer.json @@ -0,0 +1,51 @@ +{ + "name": "lubian/no-framework", + "autoload": { + "psr-4": { + "Lubian\\NoFramework\\": "src/" + } + }, + "authors": [ + { + "name": "example", + "email": "test@example.com" + } + ], + "require": { + "php": ">=8.1", + "filp/whoops": "^2.14", + "laminas/laminas-diactoros": "^2.11", + "nikic/fast-route": "^1.3", + "psr/http-server-handler": "^1.0", + "psr/container": "^1.0", + "php-di/php-di": "^6.4", + "mustache/mustache": "^2.14" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "symfony/var-dumper": "^6.0", + "slevomat/coding-standard": "^7.2", + "symplify/easy-coding-standard": "^10.2", + "rector/rector": "^0.12.23", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-strict-rules": "^1.2", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true, + "phpstan/extension-installer": true + } + }, + "scripts": { + "serve": [ + "Composer\\Config::disableProcessTimeout", + "php -S 0.0.0.0:1235 -t public" + ], + "phpstan": "./vendor/bin/phpstan analyze", + "baseline": "./vendor/bin/phpstan analyze --generate-baseline", + "check": "./vendor/bin/ecs", + "fix": "./vendor/bin/ecs --fix", + "rector": "./vendor/bin/rector process" + } +} diff --git a/implementation/12/composer.lock b/implementation/12/composer.lock new file mode 100644 index 0000000..c3de49e --- /dev/null +++ b/implementation/12/composer.lock @@ -0,0 +1,1516 @@ +{ + "_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": "ea5b586e05e6b1d75bded814662047b4", + "packages": [ + { + "name": "filp/whoops", + "version": "2.14.5", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", + "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.14.5" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2022-01-07T12:00:00+00:00" + }, + { + "name": "laminas/laminas-diactoros", + "version": "2.11.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-diactoros.git", + "reference": "d1bc565b23c2040fafde398a8a5db083c47928c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/d1bc565b23c2040fafde398a8a5db083c47928c0", + "reference": "d1bc565b23c2040fafde398a8a5db083c47928c0", + "shasum": "" + }, + "require": { + "php": "^7.3 || ~8.0.0 || ~8.1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-libxml": "*", + "http-interop/http-factory-tests": "^0.8.0", + "laminas/laminas-coding-standard": "~1.0.0", + "php-http/psr7-integration-tests": "^1.1", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.1", + "psalm/plugin-phpunit": "^0.14.0", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "laminas": { + "config-provider": "Laminas\\Diactoros\\ConfigProvider", + "module": "Laminas\\Diactoros" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php", + "src/functions/create_uploaded_file.legacy.php", + "src/functions/marshal_headers_from_sapi.legacy.php", + "src/functions/marshal_method_from_sapi.legacy.php", + "src/functions/marshal_protocol_version_from_sapi.legacy.php", + "src/functions/marshal_uri_from_sapi.legacy.php", + "src/functions/normalize_server.legacy.php", + "src/functions/normalize_uploaded_files.legacy.php", + "src/functions/parse_cookie_header.legacy.php" + ], + "psr-4": { + "Laminas\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://laminas.dev", + "keywords": [ + "http", + "laminas", + "psr", + "psr-17", + "psr-7" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-diactoros/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-diactoros/issues", + "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", + "source": "https://github.com/laminas/laminas-diactoros" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-05-17T10:57:52+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "09f0e9fb61829f628205b7c94906c28740ff9540" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/09f0e9fb61829f628205b7c94906c28740ff9540", + "reference": "09f0e9fb61829f628205b7c94906c28740ff9540", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.18", + "phpstan/phpstan": "^0.12.98", + "symfony/var-dumper": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2022-05-16T17:09:47+00:00" + }, + { + "name": "mustache/mustache", + "version": "v2.14.1", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/mustache.php.git", + "reference": "579ffa5c96e1d292c060b3dd62811ff01ad8c24e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/579ffa5c96e1d292c060b3dd62811ff01ad8c24e", + "reference": "579ffa5c96e1d292c060b3dd62811ff01ad8c24e", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.11", + "phpunit/phpunit": "~3.7|~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "issues": "https://github.com/bobthecow/mustache.php/issues", + "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.1" + }, + "time": "2022-01-21T06:08:36+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "php-di/invoker", + "version": "2.3.3", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/Invoker.git", + "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/cd6d9f267d1a3474bdddf1be1da079f01b942786", + "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "psr/container": "^1.0|^2.0" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Invoker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Generic and extensible callable invoker", + "homepage": "https://github.com/PHP-DI/Invoker", + "keywords": [ + "callable", + "dependency", + "dependency-injection", + "injection", + "invoke", + "invoker" + ], + "support": { + "issues": "https://github.com/PHP-DI/Invoker/issues", + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.3" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2021-12-13T09:22:56+00:00" + }, + { + "name": "php-di/php-di", + "version": "6.4.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PHP-DI.git", + "reference": "ae0f1b3b03d8b29dff81747063cbfd6276246cc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/ae0f1b3b03d8b29dff81747063cbfd6276246cc4", + "reference": "ae0f1b3b03d8b29dff81747063cbfd6276246cc4", + "shasum": "" + }, + "require": { + "laravel/serializable-closure": "^1.0", + "php": ">=7.4.0", + "php-di/invoker": "^2.0", + "php-di/phpdoc-reader": "^2.0.1", + "psr/container": "^1.0" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "require-dev": { + "doctrine/annotations": "~1.10", + "friendsofphp/php-cs-fixer": "^2.4", + "mnapoli/phpunit-easymock": "^1.2", + "ocramius/proxy-manager": "^2.11.2", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "doctrine/annotations": "Install it if you want to use annotations (version ~1.2)", + "ocramius/proxy-manager": "Install it if you want to use lazy injection (version ~2.0)" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "DI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The dependency injection container for humans", + "homepage": "https://php-di.org/", + "keywords": [ + "PSR-11", + "container", + "container-interop", + "dependency injection", + "di", + "ioc", + "psr11" + ], + "support": { + "issues": "https://github.com/PHP-DI/PHP-DI/issues", + "source": "https://github.com/PHP-DI/PHP-DI/tree/6.4.0" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", + "type": "tidelift" + } + ], + "time": "2022-04-09T16:46:38+00:00" + }, + { + "name": "php-di/phpdoc-reader", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PhpDocReader.git", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpDocReader\\": "src/PhpDocReader" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", + "keywords": [ + "phpdoc", + "reflection" + ], + "support": { + "issues": "https://github.com/PHP-DI/PhpDocReader/issues", + "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" + }, + "time": "2020-10-12T12:39:22+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-handler/issues", + "source": "https://github.com/php-fig/http-server-handler/tree/master" + }, + "time": "2018-10-30T16:46:14+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + } + ], + "packages-dev": [ + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v0.7.2", + "source": { + "type": "git", + "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, + "time": "2022-02-04T12:51:07+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "66c7adc9dfa38b6b5838a9fb728b68a7d8348051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/66c7adc9dfa38b6b5838a9fb728b68a7d8348051", + "reference": "66c7adc9dfa38b6b5838a9fb728b68a7d8348051", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1 || ^2.0", + "php": "^7.1 || ^8.0", + "phpstan/phpstan": ">=0.11.6" + }, + "require-dev": { + "composer/composer": "^1.8", + "phing/phing": "^2.16.3", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.1.0" + }, + "time": "2020-12-13T13:06:13+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "981cc368a216c988e862a75e526b6076987d1b50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/981cc368a216c988e862a75e526b6076987d1b50", + "reference": "981cc368a216c988e862a75e526b6076987d1b50", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.5.1" + }, + "time": "2022-05-05T11:32:40+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.6.8", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "d76498c5531232cb8386ceb6004f7e013138d3ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d76498c5531232cb8386ceb6004f7e013138d3ba", + "reference": "d76498c5531232cb8386ceb6004f7e013138d3ba", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/1.6.8" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2022-05-10T06:54:21+00:00" + }, + { + "name": "phpstan/phpstan-strict-rules", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-strict-rules.git", + "reference": "0c82c96f2a55d8b91bbc7ee6512c94f68a206b43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/0c82c96f2a55d8b91bbc7ee6512c94f68a206b43", + "reference": "0c82c96f2a55d8b91bbc7ee6512c94f68a206b43", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.6.3" + }, + "require-dev": { + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Extra strict and opinionated rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.2.3" + }, + "time": "2022-05-04T15:20:40+00:00" + }, + { + "name": "rector/rector", + "version": "0.12.23", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "690b31768b322db886b35845f8452025eba2cacb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/690b31768b322db886b35845f8452025eba2cacb", + "reference": "690b31768b322db886b35845f8452025eba2cacb", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.6" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.2", + "rector/rector-cakephp": "*", + "rector/rector-doctrine": "*", + "rector/rector-laravel": "*", + "rector/rector-nette": "*", + "rector/rector-phpoffice": "*", + "rector/rector-phpunit": "*", + "rector/rector-prefixed": "*", + "rector/rector-symfony": "*" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/0.12.23" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2022-05-01T15:50:16+00:00" + }, + { + "name": "slevomat/coding-standard", + "version": "7.2.0", + "source": { + "type": "git", + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "b4f96a8beea515d2d89141b7b9ad72f526d84071" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/b4f96a8beea515d2d89141b7b9ad72f526d84071", + "reference": "b4f96a8beea515d2d89141b7b9ad72f526d84071", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7", + "php": "^7.2 || ^8.0", + "phpstan/phpdoc-parser": "^1.5.1", + "squizlabs/php_codesniffer": "^3.6.2" + }, + "require-dev": { + "phing/phing": "2.17.3", + "php-parallel-lint/php-parallel-lint": "1.3.2", + "phpstan/phpstan": "1.4.10|1.6.7", + "phpstan/phpstan-deprecation-rules": "1.0.0", + "phpstan/phpstan-phpunit": "1.0.0|1.1.1", + "phpstan/phpstan-strict-rules": "1.2.3", + "phpunit/phpunit": "7.5.20|8.5.21|9.5.20" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "SlevomatCodingStandard\\": "SlevomatCodingStandard" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "support": { + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/7.2.0" + }, + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2022-05-06T10:58:42+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.6.2", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2021-12-12T21:44:58+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.25.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-30T18:21:41+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.0.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "fa61dfb4bd3068df2492013dc65f3190e9f550c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/fa61dfb4bd3068df2492013dc65f3190e9f550c0", + "reference": "fa61dfb4bd3068df2492013dc65f3190e9f550c0", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.0.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-04-26T13:22:23+00:00" + }, + { + "name": "symplify/easy-coding-standard", + "version": "10.2.6", + "source": { + "type": "git", + "url": "https://github.com/symplify/easy-coding-standard.git", + "reference": "8875d8cd438756c9719fcdcc3b7d0c1d06515dd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symplify/easy-coding-standard/zipball/8875d8cd438756c9719fcdcc3b7d0c1d06515dd5", + "reference": "8875d8cd438756c9719fcdcc3b7d0c1d06515dd5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "conflict": { + "friendsofphp/php-cs-fixer": "<3.0", + "squizlabs/php_codesniffer": "<3.6" + }, + "bin": [ + "bin/ecs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.5-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Prefixed scoped version of ECS package", + "support": { + "source": "https://github.com/symplify/easy-coding-standard/tree/10.2.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2022-05-17T07:11:50+00:00" + }, + { + "name": "thecodingmachine/phpstan-strict-rules", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/phpstan-strict-rules.git", + "reference": "2ba8fa8b328c45f3b149c05def5bf96793c594b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/phpstan-strict-rules/zipball/2ba8fa8b328c45f3b149c05def5bf96793c594b6", + "reference": "2ba8fa8b328c45f3b149c05def5bf96793c594b6", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0", + "phpstan/phpstan": "^1.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^7.1" + }, + "type": "phpstan-extension", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "phpstan": { + "includes": [ + "phpstan-strict-rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "TheCodingMachine\\PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David NĂ©grier", + "email": "d.negrier@thecodingmachine.com" + } + ], + "description": "A set of additional rules for PHPStan based on best practices followed at TheCodingMachine", + "support": { + "issues": "https://github.com/thecodingmachine/phpstan-strict-rules/issues", + "source": "https://github.com/thecodingmachine/phpstan-strict-rules/tree/v1.0.0" + }, + "time": "2021-11-08T09:10:49+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.1" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/implementation/12/config/container.php b/implementation/12/config/container.php new file mode 100644 index 0000000..1f76fa2 --- /dev/null +++ b/implementation/12/config/container.php @@ -0,0 +1,38 @@ +addDefinitions( + [ + ServerRequestInterface::class => fn () => ServerRequestFactory::fromGlobals(), + ResponseInterface::class => fn () => new Response, + Clock::class => fn () => new SystemClock, + Renderer::class => fn (MustacheRenderer $me) => $me, + Dispatcher::class => fn (Configuration $c) => simpleDispatcher(require $c->routesFile), + Mustache_Loader_FilesystemLoader::class => fn (Configuration $c) => new Mustache_Loader_FilesystemLoader( + $c->templateDir, + [ + 'extension' => $c->templateExtension, + ] + ), + Mustache_Engine::class => fn (Mustache_Loader_FilesystemLoader $loader) => new Mustache_Engine([ + 'loader' => $loader, + ]), + Configuration::class => fn () => require __DIR__ . '/settings.php', + ] +); + +return $builder->build(); diff --git a/implementation/12/config/routes.php b/implementation/12/config/routes.php new file mode 100644 index 0000000..b68712f --- /dev/null +++ b/implementation/12/config/routes.php @@ -0,0 +1,12 @@ +addRoute('GET', '/hello[/{name}]', Hello::class); + $r->addRoute('GET', '/other', [Other::class, 'handle']); + $r->addRoute('GET', '/', fn (ResponseInterface $r) => $r->withHeader('Location', '/hello') ->withStatus(302)); +}; diff --git a/implementation/12/config/settings.php b/implementation/12/config/settings.php new file mode 100644 index 0000000..1862e1f --- /dev/null +++ b/implementation/12/config/settings.php @@ -0,0 +1,5 @@ +parallel(); + $config->paths([__DIR__ . '/src', __DIR__ . '/config', __DIR__ . '/ecs.php', __DIR__ . '/rector.php']); + $config->skip([BlankLineAfterOpeningTagFixer::class, OrderedImportsFixer::class, NewWithBracesFixer::class]); + + $config->sets([ + SetList::PSR_12, + SetList::STRICT, + SetList::ARRAY, + SetList::SPACES, + SetList::DOCBLOCK, + SetList::CLEAN_CODE, + SetList::COMMON, + SetList::COMMENTS, + SetList::NAMESPACES, + SetList::SYMPLIFY, + SetList::CONTROL_STRUCTURES, + ]); + + // force visibility declaration on class constants + $config->ruleWithConfiguration(ClassConstantVisibilitySniff::class, [ + 'fixable' => true, + ]); + + // sort all use statements + $config->rules([ + AlphabeticallySortedUsesSniff::class, + DisallowGroupUseSniff::class, + MultipleUsesPerLineSniff::class, + NamespaceSpacingSniff::class, + ]); + + // import all namespaces, and event php core functions and classes + $config->ruleWithConfiguration( + ReferenceUsedNamesOnlySniff::class, + [ + 'allowFallbackGlobalConstants' => false, + 'allowFallbackGlobalFunctions' => false, + 'allowFullyQualifiedGlobalClasses' => false, + 'allowFullyQualifiedGlobalConstants' => false, + 'allowFullyQualifiedGlobalFunctions' => false, + 'allowFullyQualifiedNameForCollidingClasses' => true, + 'allowFullyQualifiedNameForCollidingConstants' => true, + 'allowFullyQualifiedNameForCollidingFunctions' => true, + 'searchAnnotations' => true, + ] + ); + + // define newlines between use statements + $config->ruleWithConfiguration(UseSpacingSniff::class, [ + 'linesCountBeforeFirstUse' => 1, + 'linesCountBetweenUseTypes' => 1, + 'linesCountAfterLastUse' => 1, + ]); + + // strict types declaration should be on same line as opening tag + $config->ruleWithConfiguration(DeclareStrictTypesSniff::class, [ + 'declareOnFirstLine' => true, + 'spacesCountAroundEqualsSign' => 0, + ]); + + // disallow ?Foo typehint in favor of Foo|null + $config->ruleWithConfiguration(UnionTypeHintFormatSniff::class, [ + 'withSpaces' => 'no', + 'shortNullable' => 'no', + 'nullPosition' => 'last', + ]); + + // Remove useless parentheses in new statements + $config->rule(NewWithoutParenthesesSniff::class); +}; diff --git a/implementation/12/phpstan-baseline.neon b/implementation/12/phpstan-baseline.neon new file mode 100644 index 0000000..38383b9 --- /dev/null +++ b/implementation/12/phpstan-baseline.neon @@ -0,0 +1,6 @@ +parameters: + ignoreErrors: + - + message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" + count: 1 + path: src/Bootstrap.php diff --git a/implementation/12/phpstan.neon b/implementation/12/phpstan.neon new file mode 100644 index 0000000..2eac45a --- /dev/null +++ b/implementation/12/phpstan.neon @@ -0,0 +1,8 @@ +includes: + - phpstan-baseline.neon + +parameters: + level: max + paths: + - src + - config \ No newline at end of file diff --git a/implementation/12/public/favicon.ico b/implementation/12/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..09499b8b3b3201e0f50088e3ac42e167778d1153 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/implementation/12/public/index.php b/implementation/12/public/index.php new file mode 100644 index 0000000..970d132 --- /dev/null +++ b/implementation/12/public/index.php @@ -0,0 +1,3 @@ +paths([__DIR__ . '/src', __DIR__ . '/config', __DIR__ . '/ecs.php', __DIR__ . '/rector.php']); + + $rectorConfig->importNames(); + + $rectorConfig->sets([LevelSetList::UP_TO_PHP_81]); +}; diff --git a/implementation/12/src/Action/Hello.php b/implementation/12/src/Action/Hello.php new file mode 100644 index 0000000..98531eb --- /dev/null +++ b/implementation/12/src/Action/Hello.php @@ -0,0 +1,31 @@ + $name, + 'time' => $clock->now() + ->format('H:i:s'), + ]; + + $content = $renderer->render('hello', $data,); + + $body = $response->getBody(); + $body->write($content); + + return $response->withBody($body) + ->withStatus(200); + } +} diff --git a/implementation/12/src/Action/Other.php b/implementation/12/src/Action/Other.php new file mode 100644 index 0000000..c42c74b --- /dev/null +++ b/implementation/12/src/Action/Other.php @@ -0,0 +1,24 @@ +response->getBody(); + + $body->write('This works too!'); + + return $this->response->withBody($body) + ->withStatus(200); + } +} diff --git a/implementation/12/src/Bootstrap.php b/implementation/12/src/Bootstrap.php new file mode 100644 index 0000000..152edf4 --- /dev/null +++ b/implementation/12/src/Bootstrap.php @@ -0,0 +1,109 @@ +environment; + +error_reporting(E_ALL); + +$whoops = new Run; + +if ($environment === 'dev') { + $whoops->pushHandler(new PrettyPageHandler); +} else { + $whoops->pushHandler(function (Throwable $t) { + error_log('ERROR: ' . $t->getMessage(), $t->getCode()); + echo 'Oooopsie'; + }); +} + +$whoops->register(); + +$container = require __DIR__ . '/../config/container.php'; +assert($container instanceof ContainerInterface); + +$request = $container->get(ServerRequestInterface::class); +assert($request instanceof ServerRequestInterface); + +$dispatcher = $container->get(Dispatcher::class); +assert($dispatcher instanceof Dispatcher); + +$routeInfo = $dispatcher->dispatch($request->getMethod(), $request->getUri() ->getPath(),); + +try { + switch ($routeInfo[0]) { + case Dispatcher::FOUND: + $routeTarget = $routeInfo[1]; + $args = $routeInfo[2]; + foreach ($routeInfo[2] as $attributeName => $attributeValue) { + $request = $request->withAttribute($attributeName, $attributeValue); + } + $args['request'] = $request; + $invoker = $container->get(InvokerInterface::class); + assert($invoker instanceof InvokerInterface); + $response = $invoker->call($routeTarget, $args); + assert($response instanceof ResponseInterface); + break; + case Dispatcher::METHOD_NOT_ALLOWED: + throw new MethodNotAllowed; + case Dispatcher::NOT_FOUND: + default: + throw new NotFound; + } +} catch (MethodNotAllowed) { + $response = (new Response)->withStatus(405); + $response->getBody() + ->write('Method not Allowed'); +} catch (NotFound) { + $response = (new Response)->withStatus(404); + $response->getBody() + ->write('Not Found'); +} catch (Throwable $t) { + throw new InternalServerError($t->getMessage(), $t->getCode(), $t); +} + +foreach ($response->getHeaders() as $name => $values) { + $first = strtolower($name) !== 'set-cookie'; + foreach ($values as $value) { + $header = sprintf('%s: %s', $name, $value); + header($header, $first); + $first = false; + } +} + +$statusLine = sprintf( + 'HTTP/%s %s %s', + $response->getProtocolVersion(), + $response->getStatusCode(), + $response->getReasonPhrase() +); +header($statusLine, true, $response->getStatusCode()); + +echo $response->getBody(); diff --git a/implementation/12/src/Configuration.php b/implementation/12/src/Configuration.php new file mode 100644 index 0000000..7483fe8 --- /dev/null +++ b/implementation/12/src/Configuration.php @@ -0,0 +1,14 @@ +engine->render($template, $data); + } +} diff --git a/implementation/12/src/Template/Renderer.php b/implementation/12/src/Template/Renderer.php new file mode 100644 index 0000000..de84970 --- /dev/null +++ b/implementation/12/src/Template/Renderer.php @@ -0,0 +1,11 @@ + $data + */ + public function render(string $template, array $data): string; +} diff --git a/implementation/12/templates/hello.html b/implementation/12/templates/hello.html new file mode 100644 index 0000000..ca12a59 --- /dev/null +++ b/implementation/12/templates/hello.html @@ -0,0 +1,2 @@ +

Hello {{name}}

+

The time is: {{time}}

\ No newline at end of file