From 451d117d9ea22adc527d00155d0d2e26bbd39fa3 Mon Sep 17 00:00:00 2001 From: Marijn Doeve Date: Tue, 4 Mar 2025 08:15:50 +0100 Subject: [PATCH] WIP 3-3 --- .env.dev | 2 +- .idea/TijdVoorDeTest.iml | 38 + .idea/dataSources.xml | 12 + .idea/jsLibraryMappings.xml | 6 + .idea/php.xml | 44 +- .php-cs-fixer.dist.php | 5 +- Makefile | 10 +- compose.override.yaml | 12 +- composer.json | 21 +- composer.lock | 3016 ++++++++++++++++- config/bundles.php | 6 + config/packages/cache.yaml | 19 - config/packages/csrf.yaml | 11 + config/packages/doctrine.yaml | 2 - config/packages/security.yaml | 52 + config/packages/translation.yaml | 7 + config/packages/twig.yaml | 1 + config/packages/twig_component.yaml | 5 + config/packages/uid.yaml | 4 + config/packages/validator.yaml | 11 + config/packages/web_profiler.yaml | 17 + config/preload.php | 2 + config/routes/attributes.yaml | 9 + config/routes/easyadmin.yaml | 3 + config/routes/security.yaml | 3 + config/routes/web_profiler.yaml | 8 + frankenphp/conf.d/10-app.ini | 2 +- frankenphp/conf.d/20-app.dev.ini | 1 + frankenphp/docker-entrypoint.sh | 20 - migrations/Version20241229195702.php | 90 + migrations/Version20241229201314.php | 40 + migrations/Version20241229202103.php | 41 + migrations/Version20241229202155.php | 32 + migrations/Version20241229204335.php | 34 + migrations/Version20250303221227.php | 39 + phpstan.dist.neon | 2 +- public/img/background.png | Bin 0 -> 167449 bytes public/index.php | 9 +- rector.php | 19 +- src/Controller/Admin/AnswerCrudController.php | 28 + .../Admin/CandidateCrudController.php | 28 + .../Admin/CorrectionCrudController.php | 28 + src/Controller/Admin/DashboardController.php | 66 + .../Admin/GivenAnswerCrudController.php | 28 + .../Admin/QuestionCrudController.php | 28 + src/Controller/Admin/QuizCrudController.php | 28 + src/Controller/Admin/SeasonCrudController.php | 28 + src/Controller/Admin/UserCrudController.php | 28 + src/Controller/LoginController.php | 34 + src/Controller/QuizController.php | 72 + src/DataFixtures/KrtekFixtures.php | 185 + src/Entity/Answer.php | 124 + src/Entity/Candidate.php | 140 + src/Entity/Correction.php | 74 + src/Entity/GivenAnswer.php | 91 + src/Entity/Question.php | 99 + src/Entity/Quiz.php | 105 + src/Entity/Season.php | 161 + src/Entity/User.php | 143 + src/Form/EnterNameType.php | 35 + src/Form/SelectSeasonType.php | 31 + src/Helpers/Base64.php | 25 + src/Kernel.php | 2 + src/Repository/AnswerRepository.php | 20 + src/Repository/CandidateRepository.php | 34 + src/Repository/CorrectionRepository.php | 20 + src/Repository/GivenAnswerRepository.php | 20 + src/Repository/QuestionRepository.php | 20 + src/Repository/QuizRepository.php | 20 + src/Repository/SeasonRepository.php | 20 + src/Repository/UserRepository.php | 32 + symfony.lock | 108 + templates/base.html.twig | 27 +- templates/login/login.html.twig | 41 + templates/messages.html.twig | 0 templates/quiz/base.html.twig | 42 + templates/quiz/enter_name.twig | 5 + templates/quiz/question.twig | 6 + templates/quiz/select_season.html.twig | 4 + tests/LoginControllerTest.php | 85 + tests/bootstrap.php | 6 +- translations/.gitignore | 0 translations/messages+intl-icu.nl.xlf | 14 + 83 files changed, 5528 insertions(+), 262 deletions(-) create mode 100644 .idea/dataSources.xml create mode 100644 .idea/jsLibraryMappings.xml delete mode 100644 config/packages/cache.yaml create mode 100644 config/packages/csrf.yaml create mode 100644 config/packages/security.yaml create mode 100644 config/packages/translation.yaml create mode 100644 config/packages/twig_component.yaml create mode 100644 config/packages/uid.yaml create mode 100644 config/packages/validator.yaml create mode 100644 config/packages/web_profiler.yaml create mode 100644 config/routes/attributes.yaml create mode 100644 config/routes/easyadmin.yaml create mode 100644 config/routes/security.yaml create mode 100644 config/routes/web_profiler.yaml create mode 100644 migrations/Version20241229195702.php create mode 100644 migrations/Version20241229201314.php create mode 100644 migrations/Version20241229202103.php create mode 100644 migrations/Version20241229202155.php create mode 100644 migrations/Version20241229204335.php create mode 100644 migrations/Version20250303221227.php create mode 100644 public/img/background.png create mode 100644 src/Controller/Admin/AnswerCrudController.php create mode 100644 src/Controller/Admin/CandidateCrudController.php create mode 100644 src/Controller/Admin/CorrectionCrudController.php create mode 100644 src/Controller/Admin/DashboardController.php create mode 100644 src/Controller/Admin/GivenAnswerCrudController.php create mode 100644 src/Controller/Admin/QuestionCrudController.php create mode 100644 src/Controller/Admin/QuizCrudController.php create mode 100644 src/Controller/Admin/SeasonCrudController.php create mode 100644 src/Controller/Admin/UserCrudController.php create mode 100644 src/Controller/LoginController.php create mode 100644 src/Controller/QuizController.php create mode 100644 src/DataFixtures/KrtekFixtures.php create mode 100644 src/Entity/Answer.php create mode 100644 src/Entity/Candidate.php create mode 100644 src/Entity/Correction.php create mode 100644 src/Entity/GivenAnswer.php create mode 100644 src/Entity/Question.php create mode 100644 src/Entity/Quiz.php create mode 100644 src/Entity/Season.php create mode 100644 src/Entity/User.php create mode 100644 src/Form/EnterNameType.php create mode 100644 src/Form/SelectSeasonType.php create mode 100644 src/Helpers/Base64.php create mode 100644 src/Repository/AnswerRepository.php create mode 100644 src/Repository/CandidateRepository.php create mode 100644 src/Repository/CorrectionRepository.php create mode 100644 src/Repository/GivenAnswerRepository.php create mode 100644 src/Repository/QuestionRepository.php create mode 100644 src/Repository/QuizRepository.php create mode 100644 src/Repository/SeasonRepository.php create mode 100644 src/Repository/UserRepository.php create mode 100644 templates/login/login.html.twig create mode 100644 templates/messages.html.twig create mode 100644 templates/quiz/base.html.twig create mode 100644 templates/quiz/enter_name.twig create mode 100644 templates/quiz/question.twig create mode 100644 templates/quiz/select_season.html.twig create mode 100644 tests/LoginControllerTest.php create mode 100644 translations/.gitignore create mode 100644 translations/messages+intl-icu.nl.xlf diff --git a/.env.dev b/.env.dev index f359c83..90c9484 100644 --- a/.env.dev +++ b/.env.dev @@ -1,4 +1,4 @@ - +#APP_DEBUG=1 ###> symfony/framework-bundle ### APP_SECRET=e26b9552d9e7f969b160373effaa7690 ###< symfony/framework-bundle ### diff --git a/.idea/TijdVoorDeTest.iml b/.idea/TijdVoorDeTest.iml index a3b4ce0..a906c34 100644 --- a/.idea/TijdVoorDeTest.iml +++ b/.idea/TijdVoorDeTest.iml @@ -97,8 +97,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..5c91296 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + postgresql + true + org.postgresql.Driver + jdbc:postgresql://localhost:5432/app + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml new file mode 100644 index 0000000..b843835 --- /dev/null +++ b/.idea/jsLibraryMappings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml index 557a48c..f9cad3d 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -1,5 +1,10 @@ + + + + + @@ -121,6 +126,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -206,7 +248,7 @@ diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 93d3dab..90c648c 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -1,5 +1,7 @@ in(__DIR__) ->exclude('var') @@ -9,6 +11,7 @@ return (new PhpCsFixer\Config()) ->setRules([ '@Symfony' => true, '@Symfony:risky' => true, + 'declare_strict_types' => true, 'linebreak_after_opening_tag' => true, 'mb_str_functions' => true, 'no_php4_constructor' => true, @@ -20,8 +23,8 @@ return (new PhpCsFixer\Config()) 'strict_comparison' => true, 'strict_param' => true, 'blank_line_between_import_groups' => false, + 'phpdoc_line_span' => ['const' => 'single', 'method' => 'single', 'property' => 'single'], ]) ->setRiskyAllowed(true) ->setFinder($finder) ; - diff --git a/Makefile b/Makefile index 648b18c..618c977 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,16 @@ .DEFAULT_GOAL := help +.PHONY: up +up: ## Start application + @docker compose up -d + +stop: ## Stop application + @docker compose stop .PHONY: shell -shell: +shell: ## Start a shell inside the container @docker compose exec php bash .PHONY: help help: - @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-10s\033[0m %s\n", $$1, $$2}' diff --git a/compose.override.yaml b/compose.override.yaml index 22e80a5..ea5d8ca 100644 --- a/compose.override.yaml +++ b/compose.override.yaml @@ -19,12 +19,12 @@ services: # Ensure that host.docker.internal is correctly defined on Linux - host.docker.internal:host-gateway tty: true - -###> symfony/mercure-bundle ### -###< symfony/mercure-bundle ### - -###> doctrine/doctrine-bundle ### + + ###> symfony/mercure-bundle ### + ###< symfony/mercure-bundle ### + + ###> doctrine/doctrine-bundle ### database: ports: - - "5432" + - "5432:5432" ###< doctrine/doctrine-bundle ### diff --git a/composer.json b/composer.json index 890b507..c990556 100644 --- a/composer.json +++ b/composer.json @@ -13,25 +13,40 @@ "doctrine/doctrine-bundle": "^2.13", "doctrine/doctrine-migrations-bundle": "^3.3", "doctrine/orm": "^3.3", + "easycorp/easyadmin-bundle": "^4.23", "runtime/frankenphp-symfony": "^0.2.0", + "symfony/asset": "7.2.*", "symfony/console": "7.2.*", "symfony/dotenv": "7.2.*", - "symfony/flex": "^2", + "symfony/flex": "^2.4.7", + "symfony/form": "7.2.*", "symfony/framework-bundle": "7.2.*", "symfony/runtime": "7.2.*", + "symfony/security-bundle": "7.2.*", "symfony/twig-bundle": "7.2.*", - "symfony/yaml": "7.2.*" + "symfony/uid": "7.2.*", + "symfony/yaml": "7.2.*", + "thecodingmachine/safe": "^2.5" }, "require-dev": { + "doctrine/doctrine-fixtures-bundle": "^4.0", "friendsofphp/php-cs-fixer": "^3.65", + "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2.0", + "phpstan/phpstan-doctrine": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-symfony": "^2.0", "phpunit/phpunit": "^11", "rector/rector": "^2.0", - "symfony/maker-bundle": "^1.61" + "symfony/maker-bundle": "^1.62.1", + "symfony/stopwatch": "7.2.*", + "symfony/web-profiler-bundle": "7.2.*", + "thecodingmachine/phpstan-safe-rule": "^1.3" }, "config": { "allow-plugins": { "php-http/discovery": true, + "phpstan/extension-installer": true, "symfony/flex": true, "symfony/runtime": true }, diff --git a/composer.lock b/composer.lock index b88f6d9..c6448e2 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": "bf1f9bbdd9d288044439390960ecd0db", + "content-hash": "3ce6d5ed5a5a5eec50865b9e70c1f10a", "packages": [ { "name": "doctrine/cache", @@ -1229,6 +1229,107 @@ }, "time": "2024-10-21T18:21:57+00:00" }, + { + "name": "easycorp/easyadmin-bundle", + "version": "v4.23.0", + "source": { + "type": "git", + "url": "https://github.com/EasyCorp/EasyAdminBundle.git", + "reference": "d35918bf18dab8d33e7e1fa8a490c69555bd22e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/d35918bf18dab8d33e7e1fa8a490c69555bd22e4", + "reference": "d35918bf18dab8d33e7e1fa8a490c69555bd22e4", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "^2.5", + "doctrine/orm": "^2.12|^3.0", + "ext-json": "*", + "php": ">=8.1", + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^3.0", + "symfony/doctrine-bridge": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/security-bundle": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/ux-twig-component": "^2.21", + "symfony/validator": "^5.4|^6.0|^7.0", + "twig/extra-bundle": "^3.17", + "twig/html-extra": "^3.17", + "twig/twig": "^3.15" + }, + "require-dev": { + "doctrine/doctrine-fixtures-bundle": "^3.4|3.5.x-dev", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-phpunit": "^1.2", + "phpstan/phpstan-strict-rules": "^1.4", + "phpstan/phpstan-symfony": "^1.2", + "psr/log": "^1.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/debug-bundle": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/phpunit-bridge": "^6.1|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "EasyCorp\\Bundle\\EasyAdminBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Project Contributors", + "homepage": "https://github.com/EasyCorp/EasyAdminBundle/graphs/contributors" + } + ], + "description": "Admin generator for Symfony applications", + "homepage": "https://github.com/EasyCorp/EasyAdminBundle", + "keywords": [ + "admin", + "backend", + "generator" + ], + "support": { + "issues": "https://github.com/EasyCorp/EasyAdminBundle/issues", + "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.23.0" + }, + "funding": [ + { + "url": "https://github.com/javiereguiluz", + "type": "github" + } + ], + "time": "2025-01-18T19:13:35+00:00" + }, { "name": "psr/cache", "version": "3.0.0", @@ -1278,6 +1379,54 @@ }, "time": "2021-02-03T23:26:27+00:00" }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", "version": "2.0.2", @@ -1484,17 +1633,86 @@ "time": "2023-12-12T12:06:11+00:00" }, { - "name": "symfony/cache", - "version": "v7.2.1", + "name": "symfony/asset", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "e7e983596b744c4539f31e79b0350a6cf5878a20" + "url": "https://github.com/symfony/asset.git", + "reference": "cb926cd59fefa1f9b4900b3695f0f846797ba5c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/e7e983596b744c4539f31e79b0350a6cf5878a20", - "reference": "e7e983596b744c4539f31e79b0350a6cf5878a20", + "url": "https://api.github.com/repos/symfony/asset/zipball/cb926cd59fefa1f9b4900b3695f0f846797ba5c0", + "reference": "cb926cd59fefa1f9b4900b3695f0f846797ba5c0", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Asset\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset/tree/v7.2.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": "2024-10-25T15:15:23+00:00" + }, + { + "name": "symfony/cache", + "version": "v7.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "d33cd9e14326e14a4145c21e600602eaf17cc9e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/d33cd9e14326e14a4145c21e600602eaf17cc9e7", + "reference": "d33cd9e14326e14a4145c21e600602eaf17cc9e7", "shasum": "" }, "require": { @@ -1563,7 +1781,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.2.1" + "source": "https://github.com/symfony/cache/tree/v7.2.4" }, "funding": [ { @@ -1579,7 +1797,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:08:50+00:00" + "time": "2025-02-26T09:57:54+00:00" }, { "name": "symfony/cache-contracts", @@ -1658,17 +1876,91 @@ "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/config", + "name": "symfony/clock", "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "bcd3c4adf0144dee5011bb35454728c38adec055" + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/bcd3c4adf0144dee5011bb35454728c38adec055", - "reference": "bcd3c4adf0144dee5011bb35454728c38adec055", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "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": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.2.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/config", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "7716594aaae91d9141be080240172a92ecca4d44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/7716594aaae91d9141be080240172a92ecca4d44", + "reference": "7716594aaae91d9141be080240172a92ecca4d44", "shasum": "" }, "require": { @@ -1714,7 +2006,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.2.0" + "source": "https://github.com/symfony/config/tree/v7.2.3" }, "funding": [ { @@ -1730,7 +2022,7 @@ "type": "tidelift" } ], - "time": "2024-11-04T11:36:24+00:00" + "time": "2025-01-22T12:07:01+00:00" }, { "name": "symfony/console", @@ -1827,16 +2119,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v7.2.0", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "a475747af1a1c98272a5471abc35f3da81197c5d" + "reference": "f0a1614cccb4b8431a97076f9debc08ddca321ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a475747af1a1c98272a5471abc35f3da81197c5d", - "reference": "a475747af1a1c98272a5471abc35f3da81197c5d", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f0a1614cccb4b8431a97076f9debc08ddca321ca", + "reference": "f0a1614cccb4b8431a97076f9debc08ddca321ca", "shasum": "" }, "require": { @@ -1887,7 +2179,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.2.0" + "source": "https://github.com/symfony/dependency-injection/tree/v7.2.4" }, "funding": [ { @@ -1903,7 +2195,7 @@ "type": "tidelift" } ], - "time": "2024-11-25T15:45:00+00:00" + "time": "2025-02-21T09:47:16+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1974,21 +2266,21 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.2.1", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b492be51eb703723d682851a0c9fb39b9d1a7bfb" + "reference": "95bc5dde5202828bbc462bc06ba67cd244fa8a15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b492be51eb703723d682851a0c9fb39b9d1a7bfb", - "reference": "b492be51eb703723d682851a0c9fb39b9d1a7bfb", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/95bc5dde5202828bbc462bc06ba67cd244fa8a15", + "reference": "95bc5dde5202828bbc462bc06ba67cd244fa8a15", "shasum": "" }, "require": { "doctrine/event-manager": "^2", - "doctrine/persistence": "^3.1", + "doctrine/persistence": "^3.1|^4", "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", @@ -2063,7 +2355,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.2.1" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.2.4" }, "funding": [ { @@ -2079,7 +2371,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:50:44+00:00" + "time": "2025-02-18T16:43:05+00:00" }, { "name": "symfony/dotenv", @@ -2157,16 +2449,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.2.1", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "6150b89186573046167796fa5f3f76601d5145f8" + "reference": "aabf79938aa795350c07ce6464dd1985607d95d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/6150b89186573046167796fa5f3f76601d5145f8", - "reference": "6150b89186573046167796fa5f3f76601d5145f8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/aabf79938aa795350c07ce6464dd1985607d95d5", + "reference": "aabf79938aa795350c07ce6464dd1985607d95d5", "shasum": "" }, "require": { @@ -2212,7 +2504,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.2.1" + "source": "https://github.com/symfony/error-handler/tree/v7.2.4" }, "funding": [ { @@ -2228,7 +2520,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:50:44+00:00" + "time": "2025-02-02T20:27:07+00:00" }, { "name": "symfony/event-dispatcher", @@ -2454,16 +2746,16 @@ }, { "name": "symfony/finder", - "version": "v7.2.0", + "version": "v7.2.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49" + "reference": "87a71856f2f56e4100373e92529eed3171695cfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/6de263e5868b9a137602dd1e33e4d48bfae99c49", - "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49", + "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb", "shasum": "" }, "require": { @@ -2498,7 +2790,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.2.0" + "source": "https://github.com/symfony/finder/tree/v7.2.2" }, "funding": [ { @@ -2514,7 +2806,7 @@ "type": "tidelift" } ], - "time": "2024-10-23T06:56:12+00:00" + "time": "2024-12-30T19:00:17+00:00" }, { "name": "symfony/flex", @@ -2585,17 +2877,114 @@ "time": "2024-10-07T08:51:54+00:00" }, { - "name": "symfony/framework-bundle", - "version": "v7.2.1", + "name": "symfony/form", + "version": "v7.2.4", "source": { "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "1c630f4697c9bd87b342e8090cc9022071af4d77" + "url": "https://github.com/symfony/form.git", + "reference": "7209804c018b88cc2b0beabe38eef91b83f1d69a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1c630f4697c9bd87b342e8090cc9022071af4d77", - "reference": "1c630f4697c9bd87b342e8090cc9022071af4d77", + "url": "https://api.github.com/repos/symfony/form/zipball/7209804c018b88cc2b0beabe38eef91b83f1d69a", + "reference": "7209804c018b88cc2b0beabe38eef91b83f1d69a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/options-resolver": "^6.4|^7.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/polyfill-mbstring": "~1.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/error-handler": "<6.4", + "symfony/framework-bundle": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "doctrine/collections": "^1.0|^2.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Form\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows to easily create, process and reuse HTML forms", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/form/tree/v7.2.4" + }, + "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": "2025-02-07T22:04:27+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v7.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "6d6614378cd8128eed0a037ce6ac51a26c5aaed5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6d6614378cd8128eed0a037ce6ac51a26c5aaed5", + "reference": "6d6614378cd8128eed0a037ce6ac51a26c5aaed5", "shasum": "" }, "require": { @@ -2716,7 +3105,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.2.1" + "source": "https://github.com/symfony/framework-bundle/tree/v7.2.4" }, "funding": [ { @@ -2732,20 +3121,20 @@ "type": "tidelift" } ], - "time": "2024-12-07T13:24:01+00:00" + "time": "2025-02-26T08:19:39+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744" + "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e88a66c3997859532bc2ddd6dd8f35aba2711744", - "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ee1b504b8926198be89d05e5b6fc4c3810c090f0", + "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0", "shasum": "" }, "require": { @@ -2794,7 +3183,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.0" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.3" }, "funding": [ { @@ -2810,20 +3199,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T18:58:46+00:00" + "time": "2025-01-17T10:56:55+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.1", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "d8ae58eecae44c8e66833e76cc50a4ad3c002d97" + "reference": "9f1103734c5789798fefb90e91de4586039003ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d8ae58eecae44c8e66833e76cc50a4ad3c002d97", - "reference": "d8ae58eecae44c8e66833e76cc50a4ad3c002d97", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f1103734c5789798fefb90e91de4586039003ed", + "reference": "9f1103734c5789798fefb90e91de4586039003ed", "shasum": "" }, "require": { @@ -2908,7 +3297,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.1" + "source": "https://github.com/symfony/http-kernel/tree/v7.2.4" }, "funding": [ { @@ -2924,7 +3313,316 @@ "type": "tidelift" } ], - "time": "2024-12-11T12:09:10+00:00" + "time": "2025-02-26T11:01:22+00:00" + }, + { + "name": "symfony/intl", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "76bb3462c6c308f8bd97d3c178c2626ae44d4dea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/76bb3462c6c308f8bd97d3c178c2626ae44d4dea", + "reference": "76bb3462c6c308f8bd97d3c178c2626ae44d4dea", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/string": "<7.1" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides access to the localization data of the ICU library", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v7.2.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": "2024-11-25T14:26:33+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "87ca22046b78c3feaff04b337f33b38510fd686b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/87ca22046b78c3feaff04b337f33b38510fd686b", + "reference": "87ca22046b78c3feaff04b337f33b38510fd686b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.2.4" + }, + "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": "2025-02-19T08:51:20+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.2.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": "2024-11-20T11:17:29+00:00" + }, + { + "name": "symfony/password-hasher", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "d8bd3d66d074c0acba1214a0d42f5941a8e1e94d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/d8bd3d66d074c0acba1214a0d42f5941a8e1e94d", + "reference": "d8bd3d66d074c0acba1214a0d42f5941a8e1e94d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "conflict": { + "symfony/security-core": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v7.2.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": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -3004,6 +3702,173 @@ ], "time": "2024-09-09T11:45:10+00:00" }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "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": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.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": "2024-09-09T11:45:10+00:00" + }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.31.0", @@ -3242,17 +4107,257 @@ "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/routing", - "version": "v7.2.0", + "name": "symfony/polyfill-uuid", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e" + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e", - "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/property-access", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "b28732e315d81fbec787f838034de7d6c9b2b902" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/b28732e315d81fbec787f838034de7d6c9b2b902", + "reference": "b28732e315d81fbec787f838034de7d6c9b2b902", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/property-info": "^6.4|^7.0" + }, + "require-dev": { + "symfony/cache": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v7.2.3" + }, + "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": "2025-01-17T10:56:55+00:00" + }, + { + "name": "symfony/property-info", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "dedb118fd588a92f226b390250b384d25f4192fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/dedb118fd588a92f226b390250b384d25f4192fe", + "reference": "dedb118fd588a92f226b390250b384d25f4192fe", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/string": "^6.4|^7.0", + "symfony/type-info": "~7.1.9|^7.2.2" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v7.2.3" + }, + "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": "2025-01-27T11:08:17+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996", + "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996", "shasum": "" }, "require": { @@ -3304,7 +4409,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.2.0" + "source": "https://github.com/symfony/routing/tree/v7.2.3" }, "funding": [ { @@ -3320,20 +4425,20 @@ "type": "tidelift" } ], - "time": "2024-11-25T11:08:51+00:00" + "time": "2025-01-17T10:56:55+00:00" }, { "name": "symfony/runtime", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "2c350568f3eaccb25fbbbf962bd67cde273121a7" + "reference": "8e8d09bd69b7f6c0260dd3d58f37bd4fbdeab5ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/2c350568f3eaccb25fbbbf962bd67cde273121a7", - "reference": "2c350568f3eaccb25fbbbf962bd67cde273121a7", + "url": "https://api.github.com/repos/symfony/runtime/zipball/8e8d09bd69b7f6c0260dd3d58f37bd4fbdeab5ad", + "reference": "8e8d09bd69b7f6c0260dd3d58f37bd4fbdeab5ad", "shasum": "" }, "require": { @@ -3383,7 +4488,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v7.2.0" + "source": "https://github.com/symfony/runtime/tree/v7.2.3" }, "funding": [ { @@ -3399,7 +4504,358 @@ "type": "tidelift" } ], - "time": "2024-11-06T11:43:25+00:00" + "time": "2024-12-29T21:39:47+00:00" + }, + { + "name": "symfony/security-bundle", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "721de227035c6e4c322fb7dd4839586d58bc0cf5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/721de227035c6e4c322fb7dd4839586d58bc0cf5", + "reference": "721de227035c6e4c322fb7dd4839586d58bc0cf5", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.2", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4.11|^7.1.4", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/password-hasher": "^6.4|^7.0", + "symfony/security-core": "^7.2", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/security-http": "^7.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/console": "<6.4", + "symfony/framework-bundle": "<6.4", + "symfony/http-client": "<6.4", + "symfony/ldap": "<6.4", + "symfony/serializer": "<6.4", + "symfony/twig-bundle": "<6.4", + "symfony/validator": "<6.4" + }, + "require-dev": { + "symfony/asset": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/ldap": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.12", + "web-token/jwt-library": "^3.3.2|^4.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-bundle/tree/v7.2.3" + }, + "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": "2025-01-07T09:39:55+00:00" + }, + { + "name": "symfony/security-core", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "466784ffcd0b5a16e05394335897f790b17d07e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/466784ffcd0b5a16e05394335897f790b17d07e4", + "reference": "466784ffcd0b5a16e05394335897f790b17d07e4", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/password-hasher": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/ldap": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/validator": "<6.4" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "psr/container": "^1.1|^2.0", + "psr/log": "^1|^2|^3", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/ldap": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", + "symfony/validator": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v7.2.3" + }, + "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": "2025-01-27T11:08:17+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/2b4b0c46c901729e4e90719eacd980381f53e0a3", + "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/security-core": "^6.4|^7.0" + }, + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - CSRF Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-csrf/tree/v7.2.3" + }, + "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": "2025-01-02T18:42:10+00:00" + }, + { + "name": "symfony/security-http", + "version": "v7.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-http.git", + "reference": "8478e95e273f8daa23bf4860dbad2a09d3fb3722" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-http/zipball/8478e95e273f8daa23bf4860dbad2a09d3fb3722", + "reference": "8478e95e273f8daa23bf4860dbad2a09d3fb3722", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/security-core": "^7.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/clock": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/http-client-contracts": "<3.0", + "symfony/security-bundle": "<6.4", + "symfony/security-csrf": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/cache": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/http-client-contracts": "^3.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "web-token/jwt-library": "^3.3.2|^4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Http\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - HTTP Integration", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-http/tree/v7.2.4" + }, + "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": "2025-02-11T16:46:20+00:00" }, { "name": "symfony/service-contracts", @@ -3486,16 +4942,16 @@ }, { "name": "symfony/stopwatch", - "version": "v7.2.0", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "696f418b0d722a4225e1c3d95489d262971ca924" + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/696f418b0d722a4225e1c3d95489d262971ca924", - "reference": "696f418b0d722a4225e1c3d95489d262971ca924", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", "shasum": "" }, "require": { @@ -3528,7 +4984,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.0" + "source": "https://github.com/symfony/stopwatch/tree/v7.2.4" }, "funding": [ { @@ -3544,7 +5000,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-02-24T10:49:57+00:00" }, { "name": "symfony/string", @@ -3633,6 +5089,101 @@ ], "time": "2024-11-13T13:31:26+00:00" }, + { + "name": "symfony/translation", + "version": "v7.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "283856e6981286cc0d800b53bd5703e8e363f05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a", + "reference": "283856e6981286cc0d800b53bd5703e8e363f05a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.2.4" + }, + "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": "2025-02-13T10:27:23+00:00" + }, { "name": "symfony/translation-contracts", "version": "v3.5.1", @@ -3713,16 +5264,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.2.1", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "d5cdf4d59da5ab44ebd7503480c22d8235887de0" + "reference": "45c00afd4c9accf00a91215067c2858e5a9a3c4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d5cdf4d59da5ab44ebd7503480c22d8235887de0", - "reference": "d5cdf4d59da5ab44ebd7503480c22d8235887de0", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/45c00afd4c9accf00a91215067c2858e5a9a3c4e", + "reference": "45c00afd4c9accf00a91215067c2858e5a9a3c4e", "shasum": "" }, "require": { @@ -3803,7 +5354,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.2.1" + "source": "https://github.com/symfony/twig-bridge/tree/v7.2.4" }, "funding": [ { @@ -3819,7 +5370,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T09:50:32+00:00" + "time": "2025-02-14T14:27:24+00:00" }, { "name": "symfony/twig-bundle", @@ -3906,17 +5457,346 @@ "time": "2024-10-23T08:11:15+00:00" }, { - "name": "symfony/var-dumper", - "version": "v7.2.0", + "name": "symfony/type-info", + "version": "v7.2.4", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" + "url": "https://github.com/symfony/type-info.git", + "reference": "269344575181c326781382ed53f7262feae3c6a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", - "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", + "url": "https://api.github.com/repos/symfony/type-info/zipball/269344575181c326781382ed53f7262feae3c6a4", + "reference": "269344575181c326781382ed53f7262feae3c6a4", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.0|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.2.4" + }, + "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": "2025-02-25T15:19:41+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "2d294d0c48df244c71c105a169d0190bfb080426" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", + "reference": "2d294d0c48df244c71c105a169d0190bfb080426", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.2.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/ux-twig-component", + "version": "v2.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/ux-twig-component.git", + "reference": "f29033b95e93aea2d498dc40eac185ed14b07800" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/f29033b95e93aea2d498dc40eac185ed14b07800", + "reference": "f29033b95e93aea2d498dc40eac185ed14b07800", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.2|^3.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "twig/twig": "^3.8" + }, + "conflict": { + "symfony/config": "<5.4.0" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/phpunit-bridge": "^6.0|^7.0", + "symfony/stimulus-bundle": "^2.9.1", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/webpack-encore-bundle": "^1.15" + }, + "type": "symfony-bundle", + "extra": { + "thanks": { + "url": "https://github.com/symfony/ux", + "name": "symfony/ux" + } + }, + "autoload": { + "psr-4": { + "Symfony\\UX\\TwigComponent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Twig components for Symfony", + "homepage": "https://symfony.com", + "keywords": [ + "components", + "symfony-ux", + "twig" + ], + "support": { + "source": "https://github.com/symfony/ux-twig-component/tree/v2.23.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": "2025-01-25T02:19:26+00:00" + }, + { + "name": "symfony/validator", + "version": "v7.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "00936b34ef29d0e0e9a5340bbce6e7562092da56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/00936b34ef29d0e0e9a5340bbce6e7562092da56", + "reference": "00936b34ef29d0e0e9a5340bbce6e7562092da56", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/lexer": "<1.1", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<7.0", + "symfony/expression-language": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/intl": "<6.4", + "symfony/property-info": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", + "symfony/type-info": "^7.1", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/bin/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v7.2.4" + }, + "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": "2025-02-21T09:47:16+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", "shasum": "" }, "require": { @@ -3970,7 +5850,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" }, "funding": [ { @@ -3986,20 +5866,20 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:48:14+00:00" + "time": "2025-01-17T11:39:41+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.2.0", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d" + "reference": "4ede73aa7a73d81506002d2caadbbdad1ef5b69a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1a6a89f95a46af0f142874c9d650a6358d13070d", - "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/4ede73aa7a73d81506002d2caadbbdad1ef5b69a", + "reference": "4ede73aa7a73d81506002d2caadbbdad1ef5b69a", "shasum": "" }, "require": { @@ -4046,7 +5926,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.2.0" + "source": "https://github.com/symfony/var-exporter/tree/v7.2.4" }, "funding": [ { @@ -4062,20 +5942,20 @@ "type": "tidelift" } ], - "time": "2024-10-18T07:58:17+00:00" + "time": "2025-02-13T10:27:23+00:00" }, { "name": "symfony/yaml", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22" + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", "shasum": "" }, "require": { @@ -4118,7 +5998,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.0" + "source": "https://github.com/symfony/yaml/tree/v7.2.3" }, "funding": [ { @@ -4134,7 +6014,288 @@ "type": "tidelift" } ], - "time": "2024-10-23T06:56:12+00:00" + "time": "2025-01-07T12:55:42+00:00" + }, + { + "name": "thecodingmachine/safe", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "files": [ + "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", + "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "deprecated/strings.php", + "lib/special_cases.php", + "deprecated/mysqli.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + }, + "time": "2023-04-05T11:54:14+00:00" + }, + { + "name": "twig/extra-bundle", + "version": "v3.18.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9746573ca4bc1cd03a767a183faadaf84e0c31fa", + "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/framework-bundle": "^5.4|^6.4|^7.0", + "symfony/twig-bundle": "^5.4|^6.4|^7.0", + "twig/twig": "^3.2|^4.0" + }, + "require-dev": { + "league/commonmark": "^1.0|^2.0", + "symfony/phpunit-bridge": "^6.4|^7.0", + "twig/cache-extra": "^3.0", + "twig/cssinliner-extra": "^3.0", + "twig/html-extra": "^3.0", + "twig/inky-extra": "^3.0", + "twig/intl-extra": "^3.0", + "twig/markdown-extra": "^3.0", + "twig/string-extra": "^3.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.18.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2024-09-26T19:22:23+00:00" + }, + { + "name": "twig/html-extra", + "version": "v3.18.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/html-extra.git", + "reference": "c63b28e192c1b7c15bb60f81d2e48b140846239a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/html-extra/zipball/c63b28e192c1b7c15bb60f81d2e48b140846239a", + "reference": "c63b28e192c1b7c15bb60f81d2e48b140846239a", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/mime": "^5.4|^6.4|^7.0", + "twig/twig": "^3.13|^4.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Twig\\Extra\\Html\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Twig extension for HTML", + "homepage": "https://twig.symfony.com", + "keywords": [ + "html", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/html-extra/tree/v3.18.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2024-12-29T10:29:59+00:00" }, { "name": "twig/twig", @@ -4508,6 +6669,175 @@ ], "time": "2024-05-06T16:37:16+00:00" }, + { + "name": "doctrine/data-fixtures", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "f7f1e12d6bceb58c204b3e77210a103c1c57601e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f7f1e12d6bceb58c204b3e77210a103c1c57601e", + "reference": "f7f1e12d6bceb58c204b3e77210a103c1c57601e", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^3.1 || ^4.0", + "php": "^8.1", + "psr/log": "^1.1 || ^2 || ^3" + }, + "conflict": { + "doctrine/dbal": "<3.5 || >=5", + "doctrine/orm": "<2.14 || >=4", + "doctrine/phpcr-odm": "<1.3.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "doctrine/dbal": "^3.5 || ^4", + "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", + "doctrine/orm": "^2.14 || ^3", + "ext-sqlite3": "*", + "fig/log-test": "^1", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5.3", + "symfony/cache": "^6.4 || ^7", + "symfony/var-exporter": "^6.4 || ^7" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database" + ], + "support": { + "issues": "https://github.com/doctrine/data-fixtures/issues", + "source": "https://github.com/doctrine/data-fixtures/tree/2.0.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2025-01-21T13:21:31+00:00" + }, + { + "name": "doctrine/doctrine-fixtures-bundle", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", + "reference": "90185317e6bb3d845667c5ebd444d9c83ae19a01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/90185317e6bb3d845667c5ebd444d9c83ae19a01", + "reference": "90185317e6bb3d845667c5ebd444d9c83ae19a01", + "shasum": "" + }, + "require": { + "doctrine/data-fixtures": "^2.0", + "doctrine/doctrine-bundle": "^2.2", + "doctrine/orm": "^2.14.0 || ^3.0", + "doctrine/persistence": "^2.4 || ^3.0", + "php": "^8.1", + "psr/log": "^2 || ^3", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/doctrine-bridge": "^5.4.48 || ^6.4.16 || ^7.1.9", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" + }, + "conflict": { + "doctrine/dbal": "< 3" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^10.5.38 || ^11" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\FixturesBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineFixturesBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "Fixture", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/4.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-fixtures-bundle", + "type": "tidelift" + } + ], + "time": "2024-12-05T18:35:55+00:00" + }, { "name": "evenement/evenement", "version": "v3.0.2", @@ -4955,6 +7285,54 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "phpstan/extension-installer", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0 || ^2.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "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", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" + }, + "time": "2024-09-04T20:21:43+00:00" + }, { "name": "phpstan/phpstan", "version": "2.0.4", @@ -5013,6 +7391,199 @@ ], "time": "2024-12-17T17:14:01+00:00" }, + { + "name": "phpstan/phpstan-doctrine", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-doctrine.git", + "reference": "bdb6a835c5aa9725979694ae9b70591e180f4853" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/bdb6a835c5aa9725979694ae9b70591e180f4853", + "reference": "bdb6a835c5aa9725979694ae9b70591e180f4853", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0.3" + }, + "conflict": { + "doctrine/collections": "<1.0", + "doctrine/common": "<2.7", + "doctrine/mongodb-odm": "<1.2", + "doctrine/orm": "<2.5", + "doctrine/persistence": "<1.3" + }, + "require-dev": { + "cache/array-adapter": "^1.1", + "composer/semver": "^3.3.2", + "cweagans/composer-patches": "^1.7.3", + "doctrine/annotations": "^2.0", + "doctrine/collections": "^1.6 || ^2.1", + "doctrine/common": "^2.7 || ^3.0", + "doctrine/dbal": "^3.3.8", + "doctrine/lexer": "^2.0 || ^3.0", + "doctrine/mongodb-odm": "^2.4.3", + "doctrine/orm": "^2.16.0", + "doctrine/persistence": "^2.2.1 || ^3.2", + "gedmo/doctrine-extensions": "^3.8", + "nesbot/carbon": "^2.49", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6.20", + "ramsey/uuid": "^4.2", + "symfony/cache": "^5.4" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Doctrine extensions for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-doctrine/issues", + "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.1" + }, + "time": "2024-12-02T16:48:00+00:00" + }, + { + "name": "phpstan/phpstan-phpunit", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-phpunit.git", + "reference": "e32ac656788a5bf3dedda89e6a2cad5643bf1a18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/e32ac656788a5bf3dedda89e6a2cad5643bf1a18", + "reference": "e32ac656788a5bf3dedda89e6a2cad5643bf1a18", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0.4" + }, + "conflict": { + "phpunit/phpunit": "<7.0" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPUnit extensions and rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-phpunit/issues", + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.3" + }, + "time": "2024-12-19T09:14:43+00:00" + }, + { + "name": "phpstan/phpstan-symfony", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-symfony.git", + "reference": "1ef4dce2baabd464c2dd3109d051bad94efa1e79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/1ef4dce2baabd464c2dd3109d051bad94efa1e79", + "reference": "1ef4dce2baabd464c2dd3109d051bad94efa1e79", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0" + }, + "conflict": { + "symfony/framework-bundle": "<3.0" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "psr/container": "1.0 || 1.1.1", + "symfony/config": "^5.4 || ^6.1", + "symfony/console": "^5.4 || ^6.1", + "symfony/dependency-injection": "^5.4 || ^6.1", + "symfony/form": "^5.4 || ^6.1", + "symfony/framework-bundle": "^5.4 || ^6.1", + "symfony/http-foundation": "^5.4 || ^6.1", + "symfony/messenger": "^5.4", + "symfony/polyfill-php80": "^1.24", + "symfony/serializer": "^5.4", + "symfony/service-contracts": "^2.2.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lukáš Unger", + "email": "looky.msc@gmail.com", + "homepage": "https://lookyman.net" + } + ], + "description": "Symfony Framework extensions and rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-symfony/issues", + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.0" + }, + "time": "2024-11-06T10:13:40+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "11.0.8", @@ -7003,16 +9574,16 @@ }, { "name": "symfony/maker-bundle", - "version": "v1.61.0", + "version": "v1.62.1", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" + "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", - "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/468ff2708200c95ebc0d85d3174b6c6711b8a590", + "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590", "shasum": "" }, "require": { @@ -7075,7 +9646,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.61.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.62.1" }, "funding": [ { @@ -7091,87 +9662,20 @@ "type": "tidelift" } ], - "time": "2024-08-29T22:50:23+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v7.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.2.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": "2024-11-20T11:17:29+00:00" + "time": "2025-01-15T00:21:40+00:00" }, { "name": "symfony/process", - "version": "v7.2.0", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" + "reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "url": "https://api.github.com/repos/symfony/process/zipball/d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf", + "reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf", "shasum": "" }, "require": { @@ -7203,7 +9707,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.0" + "source": "https://github.com/symfony/process/tree/v7.2.4" }, "funding": [ { @@ -7219,7 +9723,147 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:24:19+00:00" + "time": "2025-02-05T08:33:46+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v7.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "4ffde1c860a100533b02697d9aaf5f45759ec26a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/4ffde1c860a100533b02697d9aaf5f45759ec26a", + "reference": "4ffde1c860a100533b02697d9aaf5f45759ec26a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/config": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "conflict": { + "symfony/form": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/serializer": "<7.2" + }, + "require-dev": { + "symfony/browser-kit": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a development tool that gives detailed information about the execution of any request", + "homepage": "https://symfony.com", + "keywords": [ + "dev" + ], + "support": { + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.2.4" + }, + "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": "2025-02-14T14:27:24+00:00" + }, + { + "name": "thecodingmachine/phpstan-safe-rule", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/phpstan-safe-rule.git", + "reference": "5b4522c3a9f3bd7bd09215e91c923a9e6d21a5a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/phpstan-safe-rule/zipball/5b4522c3a9f3bd7bd09215e91c923a9e6d21a5a6", + "reference": "5b4522c3a9f3bd7bd09215e91c923a9e6d21a5a6", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5", + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0", + "thecodingmachine/safe": "^1.0 || ^2.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "phpstan-safe-rule.neon" + ] + }, + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "TheCodingMachine\\Safe\\PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Négrier", + "email": "d.negrier@thecodingmachine.com" + } + ], + "description": "A PHPStan rule to detect safety issues. Must be used in conjunction with thecodingmachine/safe", + "support": { + "issues": "https://github.com/thecodingmachine/phpstan-safe-rule/issues", + "source": "https://github.com/thecodingmachine/phpstan-safe-rule/tree/v1.3.0" + }, + "time": "2024-12-02T11:26:58+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/bundles.php b/config/bundles.php index f8486d5..a60a43e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -6,4 +6,10 @@ return [ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], + Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true], + EasyCorp\Bundle\EasyAdminBundle\EasyAdminBundle::class => ['all' => true], + Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml deleted file mode 100644 index 6899b72..0000000 --- a/config/packages/cache.yaml +++ /dev/null @@ -1,19 +0,0 @@ -framework: - cache: - # Unique name of your app: used to compute stable namespaces for cache keys. - #prefix_seed: your_vendor_name/app_name - - # The "app" cache stores to the filesystem by default. - # The data in this cache should persist between deploys. - # Other options include: - - # Redis - #app: cache.adapter.redis - #default_redis_provider: redis://localhost - - # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) - #app: cache.adapter.apcu - - # Namespaced pools use the above "app" backend by default - #pools: - #my.dedicated.cache: null diff --git a/config/packages/csrf.yaml b/config/packages/csrf.yaml new file mode 100644 index 0000000..40d4040 --- /dev/null +++ b/config/packages/csrf.yaml @@ -0,0 +1,11 @@ +# Enable stateless CSRF protection for forms and logins/logouts +framework: + form: + csrf_protection: + token_id: submit + + csrf_protection: + stateless_token_ids: + - submit + - authenticate + - logout diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 25138b9..18e7d29 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -24,8 +24,6 @@ doctrine: dir: '%kernel.project_dir%/src/Entity' prefix: 'App\Entity' alias: App - controller_resolver: - auto_mapping: false when@test: doctrine: diff --git a/config/packages/security.yaml b/config/packages/security.yaml new file mode 100644 index 0000000..2fdb44c --- /dev/null +++ b/config/packages/security.yaml @@ -0,0 +1,52 @@ +security: + # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords + password_hashers: + Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' + # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider + providers: + # used to reload user from session & other features (e.g. switch_user) + app_user_provider: + entity: + class: App\Entity\User + property: email + # used to reload user from session & other features (e.g. switch_user) + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + main: + lazy: true + provider: app_user_provider + form_login: + login_path: app_login + check_path: app_login + enable_csrf: true + logout: + path: app_logout + # where to redirect after logout + # target: app_any_route + + # activate different ways to authenticate + # https://symfony.com/doc/current/security.html#the-firewall + + # https://symfony.com/doc/current/security/impersonating_user.html + # switch_user: true + + # Easy way to control access for large sections of your site + # Note: Only the *first* access control that matches will be used + access_control: + # - { path: ^/admin, roles: ROLE_ADMIN } + # - { path: ^/profile, roles: ROLE_USER } + +when@test: + security: + password_hashers: + # By default, password hashers are resource intensive and take time. This is + # important to generate secure password hashes. In tests however, secure hashes + # are not important, waste resources and increase test times. The following + # reduces the work factor to the lowest possible values. + Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: + algorithm: auto + cost: 4 # Lowest possible value for bcrypt + time_cost: 3 # Lowest possible value for argon + memory_cost: 10 # Lowest possible value for argon diff --git a/config/packages/translation.yaml b/config/packages/translation.yaml new file mode 100644 index 0000000..a1df4db --- /dev/null +++ b/config/packages/translation.yaml @@ -0,0 +1,7 @@ +framework: + default_locale: nl + translator: + default_path: '%kernel.project_dir%/translations' + fallbacks: + - en + providers: diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index 3f795d9..eb82507 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -1,5 +1,6 @@ twig: file_name_pattern: '*.twig' + form_themes: [ 'bootstrap_5_layout.html.twig' ] when@test: twig: diff --git a/config/packages/twig_component.yaml b/config/packages/twig_component.yaml new file mode 100644 index 0000000..fd17ac6 --- /dev/null +++ b/config/packages/twig_component.yaml @@ -0,0 +1,5 @@ +twig_component: + anonymous_template_directory: 'components/' + defaults: + # Namespace & directory for components + App\Twig\Components\: 'components/' diff --git a/config/packages/uid.yaml b/config/packages/uid.yaml new file mode 100644 index 0000000..0152094 --- /dev/null +++ b/config/packages/uid.yaml @@ -0,0 +1,4 @@ +framework: + uid: + default_uuid_version: 7 + time_based_uuid_version: 7 diff --git a/config/packages/validator.yaml b/config/packages/validator.yaml new file mode 100644 index 0000000..dd47a6a --- /dev/null +++ b/config/packages/validator.yaml @@ -0,0 +1,11 @@ +framework: + validation: + # Enables validator auto-mapping support. + # For instance, basic validation constraints will be inferred from Doctrine's metadata. + #auto_mapping: + # App\Entity\: [] + +when@test: + framework: + validation: + not_compromised_password: false diff --git a/config/packages/web_profiler.yaml b/config/packages/web_profiler.yaml new file mode 100644 index 0000000..b946111 --- /dev/null +++ b/config/packages/web_profiler.yaml @@ -0,0 +1,17 @@ +when@dev: + web_profiler: + toolbar: true + intercept_redirects: false + + framework: + profiler: + only_exceptions: false + collect_serializer_data: true + +when@test: + web_profiler: + toolbar: false + intercept_redirects: false + + framework: + profiler: { collect: false } diff --git a/config/preload.php b/config/preload.php index 5ebcdb2..7cbe578 100644 --- a/config/preload.php +++ b/config/preload.php @@ -1,5 +1,7 @@ =$PHP_VERSION" runtime/frankenphp-symfony - composer config --json extra.symfony.docker 'true' - - if grep -q ^DATABASE_URL= .env; then - echo 'To finish the installation please press Ctrl+C to stop Docker Compose and run: docker compose up --build -d --wait' - sleep infinity - fi - fi - if [ -z "$(ls -A 'vendor/' 2>/dev/null)" ]; then composer install --prefer-dist --no-progress --no-interaction fi diff --git a/migrations/Version20241229195702.php b/migrations/Version20241229195702.php new file mode 100644 index 0000000..9d5fcea --- /dev/null +++ b/migrations/Version20241229195702.php @@ -0,0 +1,90 @@ +addSql('CREATE TABLE answer (id UUID NOT NULL, question_id UUID NOT NULL, text VARCHAR(255) NOT NULL, is_right_answer BOOLEAN NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_DADD4A251E27F6BF ON answer (question_id)'); + $this->addSql('COMMENT ON COLUMN answer.id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN answer.question_id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE TABLE answer_candidate (answer_id UUID NOT NULL, candidate_id UUID NOT NULL, PRIMARY KEY(answer_id, candidate_id))'); + $this->addSql('CREATE INDEX IDX_F54D5192AA334807 ON answer_candidate (answer_id)'); + $this->addSql('CREATE INDEX IDX_F54D519291BD8781 ON answer_candidate (candidate_id)'); + $this->addSql('COMMENT ON COLUMN answer_candidate.answer_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN answer_candidate.candidate_id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE TABLE candidate (id UUID NOT NULL, season_id UUID NOT NULL, name VARCHAR(16) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_C8B28E444EC001D1 ON candidate (season_id)'); + $this->addSql('COMMENT ON COLUMN candidate.id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN candidate.season_id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE TABLE given_answer (id UUID NOT NULL, candidate_id UUID NOT NULL, quiz_id UUID NOT NULL, answer_id UUID NOT NULL, created TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_9AC61A3091BD8781 ON given_answer (candidate_id)'); + $this->addSql('CREATE INDEX IDX_9AC61A30853CD175 ON given_answer (quiz_id)'); + $this->addSql('CREATE INDEX IDX_9AC61A30AA334807 ON given_answer (answer_id)'); + $this->addSql('COMMENT ON COLUMN given_answer.id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN given_answer.candidate_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN given_answer.quiz_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN given_answer.answer_id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE TABLE question (id UUID NOT NULL, quiz_id UUID NOT NULL, question VARCHAR(255) NOT NULL, enabled BOOLEAN NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_B6F7494E853CD175 ON question (quiz_id)'); + $this->addSql('COMMENT ON COLUMN question.id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN question.quiz_id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE TABLE quiz (id UUID NOT NULL, season_id UUID NOT NULL, name VARCHAR(64) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_A412FA924EC001D1 ON quiz (season_id)'); + $this->addSql('COMMENT ON COLUMN quiz.id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN quiz.season_id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE TABLE season (id UUID NOT NULL, name VARCHAR(64) NOT NULL, season_code VARCHAR(5) NOT NULL, preregister_candidates BOOLEAN NOT NULL, PRIMARY KEY(id))'); + $this->addSql('COMMENT ON COLUMN season.id IS \'(DC2Type:uuid)\''); + $this->addSql('CREATE TABLE "user" (id UUID NOT NULL, email VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_EMAIL ON "user" (email)'); + $this->addSql('COMMENT ON COLUMN "user".id IS \'(DC2Type:uuid)\''); + $this->addSql('ALTER TABLE answer ADD CONSTRAINT FK_DADD4A251E27F6BF FOREIGN KEY (question_id) REFERENCES question (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE answer_candidate ADD CONSTRAINT FK_F54D5192AA334807 FOREIGN KEY (answer_id) REFERENCES answer (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE answer_candidate ADD CONSTRAINT FK_F54D519291BD8781 FOREIGN KEY (candidate_id) REFERENCES candidate (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE candidate ADD CONSTRAINT FK_C8B28E444EC001D1 FOREIGN KEY (season_id) REFERENCES season (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE given_answer ADD CONSTRAINT FK_9AC61A3091BD8781 FOREIGN KEY (candidate_id) REFERENCES candidate (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE given_answer ADD CONSTRAINT FK_9AC61A30853CD175 FOREIGN KEY (quiz_id) REFERENCES quiz (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE given_answer ADD CONSTRAINT FK_9AC61A30AA334807 FOREIGN KEY (answer_id) REFERENCES answer (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE question ADD CONSTRAINT FK_B6F7494E853CD175 FOREIGN KEY (quiz_id) REFERENCES quiz (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE quiz ADD CONSTRAINT FK_A412FA924EC001D1 FOREIGN KEY (season_id) REFERENCES season (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE answer DROP CONSTRAINT FK_DADD4A251E27F6BF'); + $this->addSql('ALTER TABLE answer_candidate DROP CONSTRAINT FK_F54D5192AA334807'); + $this->addSql('ALTER TABLE answer_candidate DROP CONSTRAINT FK_F54D519291BD8781'); + $this->addSql('ALTER TABLE candidate DROP CONSTRAINT FK_C8B28E444EC001D1'); + $this->addSql('ALTER TABLE given_answer DROP CONSTRAINT FK_9AC61A3091BD8781'); + $this->addSql('ALTER TABLE given_answer DROP CONSTRAINT FK_9AC61A30853CD175'); + $this->addSql('ALTER TABLE given_answer DROP CONSTRAINT FK_9AC61A30AA334807'); + $this->addSql('ALTER TABLE question DROP CONSTRAINT FK_B6F7494E853CD175'); + $this->addSql('ALTER TABLE quiz DROP CONSTRAINT FK_A412FA924EC001D1'); + $this->addSql('DROP TABLE answer'); + $this->addSql('DROP TABLE answer_candidate'); + $this->addSql('DROP TABLE candidate'); + $this->addSql('DROP TABLE given_answer'); + $this->addSql('DROP TABLE question'); + $this->addSql('DROP TABLE quiz'); + $this->addSql('DROP TABLE season'); + $this->addSql('DROP TABLE "user"'); + } +} diff --git a/migrations/Version20241229201314.php b/migrations/Version20241229201314.php new file mode 100644 index 0000000..517da1c --- /dev/null +++ b/migrations/Version20241229201314.php @@ -0,0 +1,40 @@ +addSql('CREATE TABLE season_user (season_id UUID NOT NULL, user_id UUID NOT NULL, PRIMARY KEY(season_id, user_id))'); + $this->addSql('CREATE INDEX IDX_BDA4AD74EC001D1 ON season_user (season_id)'); + $this->addSql('CREATE INDEX IDX_BDA4AD7A76ED395 ON season_user (user_id)'); + $this->addSql('COMMENT ON COLUMN season_user.season_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN season_user.user_id IS \'(DC2Type:uuid)\''); + $this->addSql('ALTER TABLE season_user ADD CONSTRAINT FK_BDA4AD74EC001D1 FOREIGN KEY (season_id) REFERENCES season (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE season_user ADD CONSTRAINT FK_BDA4AD7A76ED395 FOREIGN KEY (user_id) REFERENCES "user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE season_user DROP CONSTRAINT FK_BDA4AD74EC001D1'); + $this->addSql('ALTER TABLE season_user DROP CONSTRAINT FK_BDA4AD7A76ED395'); + $this->addSql('DROP TABLE season_user'); + } +} diff --git a/migrations/Version20241229202103.php b/migrations/Version20241229202103.php new file mode 100644 index 0000000..1175d69 --- /dev/null +++ b/migrations/Version20241229202103.php @@ -0,0 +1,41 @@ +addSql('CREATE TABLE correction (id UUID NOT NULL, candidate_id UUID NOT NULL, quiz_id UUID NOT NULL, amount DOUBLE PRECISION NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_A29DA1B891BD8781 ON correction (candidate_id)'); + $this->addSql('CREATE INDEX IDX_A29DA1B8853CD175 ON correction (quiz_id)'); + $this->addSql('COMMENT ON COLUMN correction.id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN correction.candidate_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN correction.quiz_id IS \'(DC2Type:uuid)\''); + $this->addSql('ALTER TABLE correction ADD CONSTRAINT FK_A29DA1B891BD8781 FOREIGN KEY (candidate_id) REFERENCES candidate (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE correction ADD CONSTRAINT FK_A29DA1B8853CD175 FOREIGN KEY (quiz_id) REFERENCES quiz (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE correction DROP CONSTRAINT FK_A29DA1B891BD8781'); + $this->addSql('ALTER TABLE correction DROP CONSTRAINT FK_A29DA1B8853CD175'); + $this->addSql('DROP TABLE correction'); + } +} diff --git a/migrations/Version20241229202155.php b/migrations/Version20241229202155.php new file mode 100644 index 0000000..2d29722 --- /dev/null +++ b/migrations/Version20241229202155.php @@ -0,0 +1,32 @@ +addSql('CREATE UNIQUE INDEX UNIQ_A29DA1B891BD8781853CD175 ON correction (candidate_id, quiz_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('DROP INDEX UNIQ_A29DA1B891BD8781853CD175'); + } +} diff --git a/migrations/Version20241229204335.php b/migrations/Version20241229204335.php new file mode 100644 index 0000000..41e5950 --- /dev/null +++ b/migrations/Version20241229204335.php @@ -0,0 +1,34 @@ +addSql('ALTER TABLE given_answer ALTER answer_id DROP NOT NULL'); + $this->addSql('ALTER TABLE given_answer ALTER created DROP NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE given_answer ALTER answer_id SET NOT NULL'); + $this->addSql('ALTER TABLE given_answer ALTER created SET NOT NULL'); + } +} diff --git a/migrations/Version20250303221227.php b/migrations/Version20250303221227.php new file mode 100644 index 0000000..8f389fb --- /dev/null +++ b/migrations/Version20250303221227.php @@ -0,0 +1,39 @@ +addSql('ALTER TABLE given_answer ALTER created SET NOT NULL'); + $this->addSql('ALTER TABLE season ADD active_quiz_id UUID DEFAULT NULL'); + $this->addSql('COMMENT ON COLUMN season.active_quiz_id IS \'(DC2Type:uuid)\''); + $this->addSql('ALTER TABLE season ADD CONSTRAINT FK_F0E45BA96706D6B FOREIGN KEY (active_quiz_id) REFERENCES quiz (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('CREATE INDEX IDX_F0E45BA96706D6B ON season (active_quiz_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE season DROP CONSTRAINT FK_F0E45BA96706D6B'); + $this->addSql('DROP INDEX IDX_F0E45BA96706D6B'); + $this->addSql('ALTER TABLE season DROP active_quiz_id'); + $this->addSql('ALTER TABLE given_answer ALTER created DROP NOT NULL'); + } +} diff --git a/phpstan.dist.neon b/phpstan.dist.neon index e0de575..e9bd41c 100644 --- a/phpstan.dist.neon +++ b/phpstan.dist.neon @@ -1,5 +1,5 @@ parameters: - level: 6 + level: 8 paths: - bin/ - config/ diff --git a/public/img/background.png b/public/img/background.png new file mode 100644 index 0000000000000000000000000000000000000000..fabe57e1d2e0b108cd27de647385a5fae5f966a6 GIT binary patch literal 167449 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 literal 0 HcmV?d00001 diff --git a/public/index.php b/public/index.php index 2b0418f..12db4f8 100644 --- a/public/index.php +++ b/public/index.php @@ -1,7 +1,14 @@ new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); +return static function (array $context): Kernel { + $appEnv = !empty($context['APP_ENV']) ? (string) $context['APP_ENV'] : 'prod'; + $appDebug = !empty($context['APP_DEBUG']) ? filter_var($context['APP_DEBUG'], \FILTER_VALIDATE_BOOL) : 'prod' !== $appEnv; + + return new Kernel($appEnv, $appDebug); +}; diff --git a/rector.php b/rector.php index 0ece580..f800278 100644 --- a/rector.php +++ b/rector.php @@ -12,5 +12,20 @@ return RectorConfig::configure() __DIR__.'/tests', ]) ->withPhpSets() - ->withPreparedSets(deadCode: true, codeQuality: true, codingStyle: true, typeDeclarations: true, privatization: true, instanceOf: true, earlyReturn: true, strictBooleans: true, phpunitCodeQuality: true, doctrineCodeQuality: true, symfonyCodeQuality: true) - ->withComposerBased(twig: true, doctrine: true, phpunit: true); + ->withPreparedSets( + deadCode: true, + codeQuality: true, + codingStyle: true, + typeDeclarations: true, + privatization: true, + instanceOf: true, + earlyReturn: true, + strictBooleans: true, + rectorPreset: true, + phpunitCodeQuality: true, + doctrineCodeQuality: true, + symfonyCodeQuality: true, + ) + ->withComposerBased(twig: true, doctrine: true, phpunit: true) + ->withAttributesSets() +; diff --git a/src/Controller/Admin/AnswerCrudController.php b/src/Controller/Admin/AnswerCrudController.php new file mode 100644 index 0000000..f50a78b --- /dev/null +++ b/src/Controller/Admin/AnswerCrudController.php @@ -0,0 +1,28 @@ +container->get(AdminUrlGenerator::class); + + return $this->redirect($adminUrlGenerator->setController(SeasonCrudController::class)->generateUrl()); + + // Option 2. You can make your dashboard redirect to different pages depending on the user + // + // if ('jane' === $this->getUser()->getUsername()) { + // return $this->redirect('...'); + // } + + // Option 3. You can render some custom template to display a proper dashboard with widgets, etc. + // (tip: it's easier if your template extends from @EasyAdmin/page/content.html.twig) + // + // return $this->render('some/path/my-dashboard.html.twig'); + } + + public function configureDashboard(): Dashboard + { + return Dashboard::new() + ->setTitle('TijdVoorDeTest'); + } + + public function configureMenuItems(): iterable + { + yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home'); + yield MenuItem::linkToCrud('Season', 'fas fa-list', Season::class); + yield MenuItem::linkToCrud('Quiz', 'fas fa-list', Quiz::class); + yield MenuItem::linkToCrud('Question', 'fas fa-list', Question::class); + yield MenuItem::linkToCrud('Candidate', 'fas fa-list', Candidate::class); + yield MenuItem::linkToCrud('Correction', 'fas fa-list', Correction::class); + yield MenuItem::linkToCrud('User', 'fas fa-list', User::class); + yield MenuItem::linkToCrud('Given Answer', 'fas fa-list', GivenAnswer::class); + yield MenuItem::linkToCrud('Answer', 'fas fa-list', Answer::class); + yield MenuItem::linkToLogout('Logout', 'fa fa-exit'); + } +} diff --git a/src/Controller/Admin/GivenAnswerCrudController.php b/src/Controller/Admin/GivenAnswerCrudController.php new file mode 100644 index 0000000..09ab7ed --- /dev/null +++ b/src/Controller/Admin/GivenAnswerCrudController.php @@ -0,0 +1,28 @@ +getLastAuthenticationError(); + + // last username entered by the user + $lastUsername = $authenticationUtils->getLastUsername(); + + return $this->render('login/login.html.twig', [ + 'last_username' => $lastUsername, + 'error' => $error, + ]); + } + + #[Route(path: '/logout', name: 'app_logout')] + public function logout(): void + { + throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.'); + } +} diff --git a/src/Controller/QuizController.php b/src/Controller/QuizController.php new file mode 100644 index 0000000..5a4e96b --- /dev/null +++ b/src/Controller/QuizController.php @@ -0,0 +1,72 @@ +createForm(SelectSeasonType::class); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $data = $form->getData(); + + return $this->redirectToRoute('enter_name', ['seasonCode' => $data['season_code']]); + } + + return $this->render('quiz/select_season.html.twig', ['form' => $form]); + } + + #[Route(path: '/{seasonCode}', name: 'enter_name', requirements: ['seasonCode' => self::SEASON_CODE_REGEX])] + public function enterName( + Request $request, + Season $season, + ): Response { + $form = $this->createForm(EnterNameType::class); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $data = $form->getData(); + $name = $data['name']; + + return $this->redirectToRoute('quiz_page', ['seasonCode' => $season->getSeasonCode(), 'nameHash' => Base64::base64_url_encode($name)]); + } + + return $this->render('quiz/enter_name.twig', ['season' => $season, 'form' => $form]); + } + + #[Route( + path: '/{seasonCode}/{nameHash}', + name: 'quiz_page', + requirements: ['seasonCode' => self::SEASON_CODE_REGEX, 'nameHash' => self::CANDIDATE_HASH_REGEX], + )] + public function quizPage(Season $season, string $nameHash) + { + try { + $name = Base64::base64_url_decode($nameHash); + } catch (UrlException $e) { + } + + return $this->render('quiz/question.twig', ['season' => $season, 'name' => $name]); + } +} diff --git a/src/DataFixtures/KrtekFixtures.php b/src/DataFixtures/KrtekFixtures.php new file mode 100644 index 0000000..e7e9912 --- /dev/null +++ b/src/DataFixtures/KrtekFixtures.php @@ -0,0 +1,185 @@ +persist($season); + + $season->setName('Krtek Weekend') + ->setSeasonCode('12345') + ->setPreregisterCandidates(true); + + $quiz1 = new Quiz(); + $manager->persist($quiz1); + $quiz1->setName('Quiz 1') + ->setSeason($season); + + $season->setActiveQuiz($quiz1) + ->addCandidate(new Candidate('Claudia')) + ->addCandidate(new Candidate('Eelco')) + ->addCandidate(new Candidate('Elise')) + ->addCandidate(new Candidate('Gert-Jan')) + ->addCandidate(new Candidate('Iris')) + ->addCandidate(new Candidate('Jari')) + ->addCandidate(new Candidate('Lara')) + ->addCandidate(new Candidate('Lotte')) + ->addCandidate(new Candidate('Myrthe')) + ->addCandidate(new Candidate('Philine')) + ->addCandidate(new Candidate('Remy')) + ->addCandidate(new Candidate('Robbert')) + ->addCandidate(new Candidate('Tom')) + ; + + $quiz1->addQuestion((new Question()) + ->setQuestion('Is de Krtek een man of een vrouw?') + ->addAnswer(new Answer('Ja', true)) + ->addAnswer(new Answer('Nee')) + ); + + $quiz1->addQuestion((new Question()) + ->setQuestion('Hoeveel broers heeft de Krtek?') + ->addAnswer(new Answer('Geen', true)) + ->addAnswer(new Answer('1')) + ->addAnswer(new Answer('2')) + ); + + $quiz1->addQuestion((new Question()) + ->setQuestion('Wat is de lievelingsfeestdag van de Krtek?') + ->addAnswer(new Answer('Geen')) + ->addAnswer(new Answer('Diens eigen verjaardag')) + ->addAnswer(new Answer('Koningsdag')) + ->addAnswer(new Answer('Kerst', true)) + ->addAnswer(new Answer('Oud en Nieuw')) + ); + $quiz1->addQuestion((new Question()) + ->setQuestion('Hoe kwam de Krtek naar Kersteren vandaag?') + ->addAnswer(new Answer('Met het OV', true)) + ->addAnswer(new Answer('Met de auto')) + ); + $quiz1->addQuestion((new Question()) + ->setQuestion('Met wie keek de Kretek video bij binnenkomst?') + ->addAnswer(new Answer('Claudia')) + ->addAnswer(new Answer('Eelco')) + ->addAnswer(new Answer('Elise')) + ->addAnswer(new Answer('Gert-Jan')) + ->addAnswer(new Answer('Iris')) + ->addAnswer(new Answer('Jari')) + ->addAnswer(new Answer('Lara')) + ->addAnswer(new Answer('Lotte')) + ->addAnswer(new Answer('Myrthe')) + ->addAnswer(new Answer('Philine')) + ->addAnswer(new Answer('Remy')) + ->addAnswer(new Answer('Robbert')) + ->addAnswer(new Answer('Tom', true)) + ); + + $quiz1->addQuestion((new Question()) + ->setQuestion('Welk advies zou de Krtek zichzelf als kind geven?') + ->addAnswer(new Answer('Geef je vader een knuffel.')) + ->addAnswer(new Answer('Trek je wat minder aan van anderen.')) + ->addAnswer(new Answer('Luister meer naar je eigen gevoel in plaats van naar wat anderen vinden.')) + ->addAnswer(new Answer('Stel niet alles tot het laatste moment uit.')) + ->addAnswer(new Answer('Altijd doorgaan.')) + ->addAnswer(new Answer('Probeer ook eens buiten de lijntjes te kleuren', true)) + ->addAnswer(new Answer('Ga als je groot bent op groepsreis! ')) + ->addAnswer(new Answer('Trek minder aan van de mening van anderen, het is oké om anders te zijn.')) + ); + + $quiz1->addQuestion((new Question()) + ->setQuestion('Wat voor soort schoenen droeg de Krtek bij het diner?') + ->addAnswer(new Answer('Sneakers')) + ->addAnswer(new Answer('Wandel-/bergschoenen', true)) + ->addAnswer(new Answer('Lederen schoenen')) + ->addAnswer(new Answer('Pantoffels')) + ->addAnswer(new Answer('Hakken')) + ->addAnswer(new Answer('Geen schoenen, alleen sokken')) + ); + + $quiz1->addQuestion((new Question()) + ->setQuestion('Met welk vervoersmiddel reist de Krtek het liefste?') + ->addAnswer(new Answer('Fiets', true)) + ->addAnswer(new Answer('Auto')) + ->addAnswer(new Answer('Trein')) + ); + + $quiz1->addQuestion((new Question()) + ->setQuestion('Heeft de Krtek een eigen auto?') + ->addAnswer(new Answer('Ja')) + ->addAnswer(new Answer('Nee', true)) + ); + + $quiz1->addQuestion((new Question()) + ->setQuestion('Van wie is de quote die de Krtek gepakt heeft') + ->addAnswer(new Answer('Karen')) + ->addAnswer(new Answer('Gilles de Coster')) + ->addAnswer(new Answer('Kees Tol')) + ->addAnswer(new Answer('Harry en John')) + ->addAnswer(new Answer('Georgina Verbaan')) + ->addAnswer(new Answer('Marc-Marie Huijbregts')) + ->addAnswer(new Answer('Fresia Cousiño Arias, Rik van de Westelaken')) + ->addAnswer(new Answer('Ellie Lust')) + ->addAnswer(new Answer('Bouba')) + ->addAnswer(new Answer('Jan Versteegh')) + ->addAnswer(new Answer('Dick Jol')) + ->addAnswer(new Answer('Karin de Groot')) + ->addAnswer(new Answer('Pieter')) + ->addAnswer(new Answer('Renée Fokker')) + ->addAnswer(new Answer('Sam, Davy', true)) + ); + $quiz1->addQuestion((new Question()) + ->setQuestion('Zou de Krtek molboekjes, jokers, vrijstellingen of topito’s uit iemands rugzak stelen om te kunnen winnen?') + ->addAnswer(new Answer('Ja')) + ->addAnswer(new Answer('Nee', true)) + ); + $quiz1->addQuestion((new Question()) + ->setQuestion('In wat voor bed slaapt de Krtek dit weekend?') + ->addAnswer(new Answer('Éénpersoons, losstaand bed')) + ->addAnswer(new Answer('Éénpersoonsbed, tegen een ander bed aan', true)) + ->addAnswer(new Answer('Tweepersoons bed')) + ); + $quiz1->addQuestion((new Question()) + ->setQuestion('Hoeveel jaar heeft de Krtek gedaan over de middelbare school?') + ->addAnswer(new Answer('5')) + ->addAnswer(new Answer('6', true)) + ->addAnswer(new Answer('7')) + ->addAnswer(new Answer('8')) + ); + $quiz1->addQuestion((new Question()) + ->setQuestion('Waar zat de Krtek aan tafel bij het diner?') + ->addAnswer(new Answer('Met de rug naar de accommodatie')) + ->addAnswer(new Answer('Met de rug naar de buitenmuur', true)) + ); + $quiz1->addQuestion((new Question()) + ->setQuestion('Wie is de Krtek?') + ->addAnswer(new Answer('Claudia', true)) + ->addAnswer(new Answer('Eelco')) + ->addAnswer(new Answer('Elise')) + ->addAnswer(new Answer('Gert-Jan')) + ->addAnswer(new Answer('Iris')) + ->addAnswer(new Answer('Jari')) + ->addAnswer(new Answer('Lara')) + ->addAnswer(new Answer('Lotte')) + ->addAnswer(new Answer('Myrthe')) + ->addAnswer(new Answer('Philine')) + ->addAnswer(new Answer('Remy')) + ->addAnswer(new Answer('Robbert')) + ->addAnswer(new Answer('Tom')) + ); + + $manager->flush(); + } +} diff --git a/src/Entity/Answer.php b/src/Entity/Answer.php new file mode 100644 index 0000000..3e5f13a --- /dev/null +++ b/src/Entity/Answer.php @@ -0,0 +1,124 @@ + */ + #[ORM\ManyToMany(targetEntity: Candidate::class, inversedBy: 'answersOnCandidate')] + private Collection $candidates; + + /** @var Collection */ + #[ORM\OneToMany(targetEntity: GivenAnswer::class, mappedBy: 'answer', orphanRemoval: true)] + private Collection $givenAnswers; + + public function __construct( + #[ORM\Column(length: 255)] + private string $text, + #[ORM\Column] + private bool $isRightAnswer = false, + ) { + $this->candidates = new ArrayCollection(); + $this->givenAnswers = new ArrayCollection(); + } + + public function getId(): Uuid + { + return $this->id; + } + + public function getText(): string + { + return $this->text; + } + + public function setText(string $text): static + { + $this->text = $text; + + return $this; + } + + public function getQuestion(): Question + { + return $this->question; + } + + public function setQuestion(Question $question): static + { + $this->question = $question; + + return $this; + } + + public function isRightAnswer(): ?bool + { + return $this->isRightAnswer; + } + + public function setRightAnswer(bool $isRightAnswer): static + { + $this->isRightAnswer = $isRightAnswer; + + return $this; + } + + /** @return Collection */ + public function getCandidates(): Collection + { + return $this->candidates; + } + + public function addCandidate(Candidate $candidate): static + { + if (!$this->candidates->contains($candidate)) { + $this->candidates->add($candidate); + } + + return $this; + } + + public function removeCandidate(Candidate $candidate): static + { + $this->candidates->removeElement($candidate); + + return $this; + } + + /** @return Collection */ + public function getGivenAnswers(): Collection + { + return $this->givenAnswers; + } + + public function addGivenAnswer(GivenAnswer $givenAnswer): static + { + if (!$this->givenAnswers->contains($givenAnswer)) { + $this->givenAnswers->add($givenAnswer); + $givenAnswer->setAnswer($this); + } + + return $this; + } +} diff --git a/src/Entity/Candidate.php b/src/Entity/Candidate.php new file mode 100644 index 0000000..b086ca9 --- /dev/null +++ b/src/Entity/Candidate.php @@ -0,0 +1,140 @@ + */ + #[ORM\ManyToMany(targetEntity: Answer::class, mappedBy: 'candidates')] + private Collection $answersOnCandidate; + + /** @var Collection */ + #[ORM\OneToMany(targetEntity: GivenAnswer::class, mappedBy: 'candidate', orphanRemoval: true)] + private Collection $givenAnswers; + + /** @var Collection */ + #[ORM\OneToMany(targetEntity: Correction::class, mappedBy: 'candidate', orphanRemoval: true)] + private Collection $corrections; + + public function __construct( + #[ORM\Column(length: 16)] + private string $name, + ) { + $this->answersOnCandidate = new ArrayCollection(); + $this->givenAnswers = new ArrayCollection(); + $this->corrections = new ArrayCollection(); + } + + public function getId(): ?Uuid + { + return $this->id; + } + + public function getSeason(): Season + { + return $this->season; + } + + public function setSeason(Season $season): static + { + $this->season = $season; + + return $this; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): static + { + $this->name = $name; + + return $this; + } + + /** @return Collection */ + public function getAnswersOnCandidate(): Collection + { + return $this->answersOnCandidate; + } + + public function addAnswersOnCandidate(Answer $answersOnCandidate): static + { + if (!$this->answersOnCandidate->contains($answersOnCandidate)) { + $this->answersOnCandidate->add($answersOnCandidate); + $answersOnCandidate->addCandidate($this); + } + + return $this; + } + + public function removeAnswersOnCandidate(Answer $answersOnCandidate): static + { + if ($this->answersOnCandidate->removeElement($answersOnCandidate)) { + $answersOnCandidate->removeCandidate($this); + } + + return $this; + } + + /** @return Collection */ + public function getGivenAnswers(): Collection + { + return $this->givenAnswers; + } + + public function addGivenAnswer(GivenAnswer $givenAnswer): static + { + if (!$this->givenAnswers->contains($givenAnswer)) { + $this->givenAnswers->add($givenAnswer); + $givenAnswer->setCandidate($this); + } + + return $this; + } + + /** @return Collection */ + public function getCorrections(): Collection + { + return $this->corrections; + } + + public function addCorrection(Correction $correction): static + { + if (!$this->corrections->contains($correction)) { + $this->corrections->add($correction); + $correction->setCandidate($this); + } + + return $this; + } + + public function getNameHash(): string + { + return Base64::base64_url_encode($this->name); + } +} diff --git a/src/Entity/Correction.php b/src/Entity/Correction.php new file mode 100644 index 0000000..5e9cd26 --- /dev/null +++ b/src/Entity/Correction.php @@ -0,0 +1,74 @@ +id; + } + + public function getCandidate(): Candidate + { + return $this->candidate; + } + + public function setCandidate(Candidate $candidate): static + { + $this->candidate = $candidate; + + return $this; + } + + public function getQuiz(): Quiz + { + return $this->quiz; + } + + public function setQuiz(Quiz $quiz): static + { + $this->quiz = $quiz; + + return $this; + } + + public function getAmount(): ?float + { + return $this->amount; + } + + public function setAmount(float $amount): static + { + $this->amount = $amount; + + return $this; + } +} diff --git a/src/Entity/GivenAnswer.php b/src/Entity/GivenAnswer.php new file mode 100644 index 0000000..4d907d5 --- /dev/null +++ b/src/Entity/GivenAnswer.php @@ -0,0 +1,91 @@ +id; + } + + public function getCandidate(): Candidate + { + return $this->candidate; + } + + public function setCandidate(Candidate $candidate): static + { + $this->candidate = $candidate; + + return $this; + } + + public function getQuiz(): ?Quiz + { + return $this->quiz; + } + + public function setQuiz(Quiz $quiz): static + { + $this->quiz = $quiz; + + return $this; + } + + public function getAnswer(): ?Answer + { + return $this->answer; + } + + public function setAnswer(?Answer $answer): static + { + $this->answer = $answer; + + return $this; + } + + public function getCreated(): ?\DateTimeInterface + { + return $this->created; + } + + #[ORM\PrePersist] + public function setCreatedAtValue(): void + { + $this->created = new DateTimeImmutable(); + } +} diff --git a/src/Entity/Question.php b/src/Entity/Question.php new file mode 100644 index 0000000..9ea7020 --- /dev/null +++ b/src/Entity/Question.php @@ -0,0 +1,99 @@ + */ + #[ORM\OneToMany(targetEntity: Answer::class, mappedBy: 'question', cascade: ['persist'], orphanRemoval: true)] + private Collection $answers; + + public function __construct() + { + $this->answers = new ArrayCollection(); + } + + public function getId(): ?Uuid + { + return $this->id; + } + + public function getQuestion(): string + { + return $this->question; + } + + public function setQuestion(string $question): static + { + $this->question = $question; + + return $this; + } + + public function getQuiz(): Quiz + { + return $this->quiz; + } + + public function setQuiz(Quiz $quiz): static + { + $this->quiz = $quiz; + + return $this; + } + + public function isEnabled(): ?bool + { + return $this->enabled; + } + + public function setEnabled(bool $enabled): static + { + $this->enabled = $enabled; + + return $this; + } + + /** @return Collection */ + public function getAnswers(): Collection + { + return $this->answers; + } + + public function addAnswer(Answer $answer): static + { + if (!$this->answers->contains($answer)) { + $this->answers->add($answer); + $answer->setQuestion($this); + } + + return $this; + } +} diff --git a/src/Entity/Quiz.php b/src/Entity/Quiz.php new file mode 100644 index 0000000..483dbac --- /dev/null +++ b/src/Entity/Quiz.php @@ -0,0 +1,105 @@ + */ + #[ORM\OneToMany(targetEntity: Question::class, mappedBy: 'quiz', cascade: ['persist'], orphanRemoval: true)] + private Collection $questions; + + /** @var Collection */ + #[ORM\OneToMany(targetEntity: Correction::class, mappedBy: 'quiz', orphanRemoval: true)] + private Collection $corrections; + + public function __construct() + { + $this->questions = new ArrayCollection(); + $this->corrections = new ArrayCollection(); + } + + public function getId(): ?Uuid + { + return $this->id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): static + { + $this->name = $name; + + return $this; + } + + public function getSeason(): Season + { + return $this->season; + } + + public function setSeason(Season $season): static + { + $this->season = $season; + + return $this; + } + + /** @return Collection */ + public function getQuestions(): Collection + { + return $this->questions; + } + + public function addQuestion(Question $question): static + { + if (!$this->questions->contains($question)) { + $this->questions->add($question); + $question->setQuiz($this); + } + + return $this; + } + + /** @return Collection */ + public function getCorrections(): Collection + { + return $this->corrections; + } + + public function addCorrection(Correction $correction): static + { + if (!$this->corrections->contains($correction)) { + $this->corrections->add($correction); + $correction->setQuiz($this); + } + + return $this; + } +} diff --git a/src/Entity/Season.php b/src/Entity/Season.php new file mode 100644 index 0000000..50aead0 --- /dev/null +++ b/src/Entity/Season.php @@ -0,0 +1,161 @@ + */ + #[ORM\OneToMany(targetEntity: Quiz::class, mappedBy: 'season', orphanRemoval: true)] + private Collection $quizzes; + + /** @var Collection */ + #[ORM\OneToMany(targetEntity: Candidate::class, mappedBy: 'season', cascade: ['persist'], orphanRemoval: true)] + private Collection $candidates; + + /** @var Collection */ + #[ORM\ManyToMany(targetEntity: User::class, inversedBy: 'seasons')] + private Collection $owners; + + #[ORM\ManyToOne] + private ?Quiz $ActiveQuiz = null; + + public function __construct() + { + $this->quizzes = new ArrayCollection(); + $this->candidates = new ArrayCollection(); + $this->owners = new ArrayCollection(); + } + + public function getId(): ?Uuid + { + return $this->id; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): static + { + $this->name = $name; + + return $this; + } + + public function getSeasonCode(): ?string + { + return $this->seasonCode; + } + + public function setSeasonCode(string $seasonCode): static + { + $this->seasonCode = $seasonCode; + + return $this; + } + + public function isPreregisterCandidates(): bool + { + return $this->preregisterCandidates; + } + + public function setPreregisterCandidates(bool $preregisterCandidates): static + { + $this->preregisterCandidates = $preregisterCandidates; + + return $this; + } + + /** @return Collection */ + public function getQuizzes(): Collection + { + return $this->quizzes; + } + + public function addQuiz(Quiz $quiz): static + { + if (!$this->quizzes->contains($quiz)) { + $this->quizzes->add($quiz); + $quiz->setSeason($this); + } + + return $this; + } + + /** @return Collection */ + public function getCandidates(): Collection + { + return $this->candidates; + } + + public function addCandidate(Candidate $candidate): static + { + if (!$this->candidates->contains($candidate)) { + $this->candidates->add($candidate); + $candidate->setSeason($this); + } + + return $this; + } + + /** @return Collection */ + public function getOwners(): Collection + { + return $this->owners; + } + + public function addOwner(User $owner): static + { + if (!$this->owners->contains($owner)) { + $this->owners->add($owner); + } + + return $this; + } + + public function removeOwner(User $owner): static + { + $this->owners->removeElement($owner); + + return $this; + } + + public function getActiveQuiz(): ?Quiz + { + return $this->ActiveQuiz; + } + + public function setActiveQuiz(?Quiz $ActiveQuiz): static + { + $this->ActiveQuiz = $ActiveQuiz; + + return $this; + } +} diff --git a/src/Entity/User.php b/src/Entity/User.php new file mode 100644 index 0000000..fb317a2 --- /dev/null +++ b/src/Entity/User.php @@ -0,0 +1,143 @@ + The user roles */ + #[ORM\Column] + private array $roles = []; + + /** @var string The hashed password */ + #[ORM\Column] + private string $password; + + /** @var Collection */ + #[ORM\ManyToMany(targetEntity: Season::class, mappedBy: 'owners')] + private Collection $seasons; + + public function __construct() + { + $this->seasons = new ArrayCollection(); + } + + public function getId(): ?Uuid + { + return $this->id; + } + + public function getEmail(): ?string + { + return $this->email; + } + + public function setEmail(string $email): static + { + $this->email = $email; + + return $this; + } + + /** + * A visual identifier that represents this user. + * + * @see UserInterface + * + * @return non-empty-string + */ + public function getUserIdentifier(): string + { + return $this->email; + } + + /** + * @see UserInterface + * + * @return non-empty-list + */ + public function getRoles(): array + { + $roles = $this->roles; + // guarantee every user at least has ROLE_USER + $roles[] = 'ROLE_USER'; + + return array_unique($roles); + } + + /** @param list $roles */ + public function setRoles(array $roles): static + { + $this->roles = $roles; + + return $this; + } + + /** @see PasswordAuthenticatedUserInterface */ + public function getPassword(): ?string + { + return $this->password; + } + + public function setPassword(string $password): static + { + $this->password = $password; + + return $this; + } + + /** @see UserInterface */ + public function eraseCredentials(): void + { + // If you store any temporary, sensitive data on the user, clear it here + // $this->plainPassword = null; + } + + /** @return Collection */ + public function getSeasons(): Collection + { + return $this->seasons; + } + + public function addSeason(Season $season): static + { + if (!$this->seasons->contains($season)) { + $this->seasons->add($season); + $season->addOwner($this); + } + + return $this; + } + + public function removeSeason(Season $season): static + { + if ($this->seasons->removeElement($season)) { + $season->removeOwner($this); + } + + return $this; + } +} diff --git a/src/Form/EnterNameType.php b/src/Form/EnterNameType.php new file mode 100644 index 0000000..e5bdcd8 --- /dev/null +++ b/src/Form/EnterNameType.php @@ -0,0 +1,35 @@ +add('name', TextType::class, + ['required' => true, 'label' => $this->translator->trans('Enter your name')], + ) +// ->add('submit', SubmitType::class, ['label' => 'Start quiz']) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + // Configure your form options here + ]); + } +} diff --git a/src/Form/SelectSeasonType.php b/src/Form/SelectSeasonType.php new file mode 100644 index 0000000..0e96ea3 --- /dev/null +++ b/src/Form/SelectSeasonType.php @@ -0,0 +1,31 @@ +add('season_code', TextType::class, + ['required' => true, 'constraints' => new Regex(pattern: "/^[A-Za-z\d]{5}$/")], + ) +// ->add('submit', SubmitType::class, ['label' => 'Start quiz']) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + // Configure your form options here + ]); + } +} diff --git a/src/Helpers/Base64.php b/src/Helpers/Base64.php new file mode 100644 index 0000000..f9c5b27 --- /dev/null +++ b/src/Helpers/Base64.php @@ -0,0 +1,25 @@ + + */ +class AnswerRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Answer::class); + } +} diff --git a/src/Repository/CandidateRepository.php b/src/Repository/CandidateRepository.php new file mode 100644 index 0000000..5b2208a --- /dev/null +++ b/src/Repository/CandidateRepository.php @@ -0,0 +1,34 @@ + + */ +class CandidateRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Candidate::class); + } + + public function getCandidateByHash(Season $season, string $hash): ?Candidate + { + try { + $name = Base64::base64_url_decode($hash); + } catch (UrlException) { + return null; + } + + return $this->findOneBy(['season' => $season, 'name' => $name]); + } +} diff --git a/src/Repository/CorrectionRepository.php b/src/Repository/CorrectionRepository.php new file mode 100644 index 0000000..c9ae6e5 --- /dev/null +++ b/src/Repository/CorrectionRepository.php @@ -0,0 +1,20 @@ + + */ +class CorrectionRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Correction::class); + } +} diff --git a/src/Repository/GivenAnswerRepository.php b/src/Repository/GivenAnswerRepository.php new file mode 100644 index 0000000..598f1ed --- /dev/null +++ b/src/Repository/GivenAnswerRepository.php @@ -0,0 +1,20 @@ + + */ +class GivenAnswerRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, GivenAnswer::class); + } +} diff --git a/src/Repository/QuestionRepository.php b/src/Repository/QuestionRepository.php new file mode 100644 index 0000000..c8bc4b7 --- /dev/null +++ b/src/Repository/QuestionRepository.php @@ -0,0 +1,20 @@ + + */ +class QuestionRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Question::class); + } +} diff --git a/src/Repository/QuizRepository.php b/src/Repository/QuizRepository.php new file mode 100644 index 0000000..8d0421b --- /dev/null +++ b/src/Repository/QuizRepository.php @@ -0,0 +1,20 @@ + + */ +class QuizRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Quiz::class); + } +} diff --git a/src/Repository/SeasonRepository.php b/src/Repository/SeasonRepository.php new file mode 100644 index 0000000..62bd0b7 --- /dev/null +++ b/src/Repository/SeasonRepository.php @@ -0,0 +1,20 @@ + + */ +class SeasonRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Season::class); + } +} diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php new file mode 100644 index 0000000..5633a4e --- /dev/null +++ b/src/Repository/UserRepository.php @@ -0,0 +1,32 @@ + + * + * @implements PasswordUpgraderInterface + */ +class UserRepository extends ServiceEntityRepository implements PasswordUpgraderInterface +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, User::class); + } + + /** Used to upgrade (rehash) the user's password automatically over time. */ + public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void + { + $user->setPassword($newHashedPassword); + $this->getEntityManager()->persist($user); + $this->getEntityManager()->flush(); + } +} diff --git a/symfony.lock b/symfony.lock index 171e542..6b899c0 100644 --- a/symfony.lock +++ b/symfony.lock @@ -13,6 +13,18 @@ "src/Repository/.gitignore" ] }, + "doctrine/doctrine-fixtures-bundle": { + "version": "4.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "3.0", + "ref": "1f5514cfa15b947298df4d771e694e578d4c204d" + }, + "files": [ + "src/DataFixtures/AppFixtures.php" + ] + }, "doctrine/doctrine-migrations-bundle": { "version": "3.3", "recipe": { @@ -26,6 +38,15 @@ "migrations/.gitignore" ] }, + "easycorp/easyadmin-bundle": { + "version": "4.23", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "3.0", + "ref": "b131e6cbfe1b898a508987851963fff485986285" + } + }, "friendsofphp/php-cs-fixer": { "version": "3.65", "recipe": { @@ -89,6 +110,18 @@ ".env.dev" ] }, + "symfony/form": { + "version": "7.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.2", + "ref": "7d86a6723f4a623f59e2bf966b6aad2fc461d36b" + }, + "files": [ + "config/packages/csrf.yaml" + ] + }, "symfony/framework-bundle": { "version": "7.2", "recipe": { @@ -130,6 +163,32 @@ "config/routes.yaml" ] }, + "symfony/security-bundle": { + "version": "7.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.4", + "ref": "2ae08430db28c8eb4476605894296c82a642028f" + }, + "files": [ + "config/packages/security.yaml", + "config/routes/security.yaml" + ] + }, + "symfony/translation": { + "version": "7.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.3", + "ref": "e28e27f53663cc34f0be2837aba18e3a1bef8e7b" + }, + "files": [ + "config/packages/translation.yaml", + "translations/.gitignore" + ] + }, "symfony/twig-bundle": { "version": "7.2", "recipe": { @@ -142,5 +201,54 @@ "config/packages/twig.yaml", "templates/base.html.twig" ] + }, + "symfony/uid": { + "version": "7.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.0", + "ref": "0df5844274d871b37fc3816c57a768ffc60a43a5" + } + }, + "symfony/ux-twig-component": { + "version": "2.22", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "2.13", + "ref": "67814b5f9794798b885cec9d3f48631424449a01" + }, + "files": [ + "config/packages/twig_component.yaml" + ] + }, + "symfony/validator": { + "version": "7.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.0", + "ref": "8c1c4e28d26a124b0bb273f537ca8ce443472bfd" + }, + "files": [ + "config/packages/validator.yaml" + ] + }, + "symfony/web-profiler-bundle": { + "version": "7.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.1", + "ref": "e42b3f0177df239add25373083a564e5ead4e13a" + }, + "files": [ + "config/packages/web_profiler.yaml", + "config/routes/web_profiler.yaml" + ] + }, + "twig/extra-bundle": { + "version": "v3.18.0" } } diff --git a/templates/base.html.twig b/templates/base.html.twig index 1069c14..8b9aea3 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -1,16 +1,17 @@ - - - - {% block title %}Welcome!{% endblock %} - - {% block stylesheets %} - {% endblock %} + + + + {% block title %}Welcome!{% endblock %} + + {% block stylesheets %} + {% endblock %} - {% block javascripts %} - {% endblock %} - - - {% block body %}{% endblock %} - + {% block javascripts %} + {% endblock %} + + +{% block body %}{% endblock %} + diff --git a/templates/login/login.html.twig b/templates/login/login.html.twig new file mode 100644 index 0000000..07b5cd4 --- /dev/null +++ b/templates/login/login.html.twig @@ -0,0 +1,41 @@ +{% extends 'base.html.twig' %} + +{% block title %}Log in!{% endblock %} + +{% block body %} + +{% endblock %} diff --git a/templates/messages.html.twig b/templates/messages.html.twig new file mode 100644 index 0000000..e69de29 diff --git a/templates/quiz/base.html.twig b/templates/quiz/base.html.twig new file mode 100644 index 0000000..50184fc --- /dev/null +++ b/templates/quiz/base.html.twig @@ -0,0 +1,42 @@ + + + + + + + + {% block title %} + Tijd voor de test + {% endblock title %} + + + + +
+
+ {% block body %} + {% endblock body %} +
+ {% block script %} + {% endblock script %} +
+ + diff --git a/templates/quiz/enter_name.twig b/templates/quiz/enter_name.twig new file mode 100644 index 0000000..044a6fc --- /dev/null +++ b/templates/quiz/enter_name.twig @@ -0,0 +1,5 @@ +{% extends "quiz/base.html.twig" %} +{% block body %} + {{ season.name }} + {{ form(form) }} +{% endblock body %} diff --git a/templates/quiz/question.twig b/templates/quiz/question.twig new file mode 100644 index 0000000..d3e1db3 --- /dev/null +++ b/templates/quiz/question.twig @@ -0,0 +1,6 @@ +{% extends "quiz/base.html.twig" %} +{% block body %} + {{ season.name }} + {{ name }} +

Hello World!

+{% endblock body %} diff --git a/templates/quiz/select_season.html.twig b/templates/quiz/select_season.html.twig new file mode 100644 index 0000000..22a4453 --- /dev/null +++ b/templates/quiz/select_season.html.twig @@ -0,0 +1,4 @@ +{% extends "quiz/base.html.twig" %} +{% block body %} + {{ form(form) }} +{% endblock body %} diff --git a/tests/LoginControllerTest.php b/tests/LoginControllerTest.php new file mode 100644 index 0000000..ff6134a --- /dev/null +++ b/tests/LoginControllerTest.php @@ -0,0 +1,85 @@ +client = static::createClient(); + $container = static::getContainer(); + $em = $container->get('doctrine.orm.entity_manager'); + $userRepository = $em->getRepository(User::class); + + // Remove any existing users from the test database + foreach ($userRepository->findAll() as $user) { + $em->remove($user); + } + + $em->flush(); + + // Create a User fixture + /** @var UserPasswordHasherInterface $passwordHasher */ + $passwordHasher = $container->get('security.user_password_hasher'); + + $user = (new User())->setEmail('email@example.com'); + $user->setPassword($passwordHasher->hashPassword($user, 'password')); + + $em->persist($user); + $em->flush(); + } + + public function testLogin(): void + { + // Denied - Can't login with invalid email address. + $this->client->request('GET', '/login'); + $this->assertResponseIsSuccessful(); + + $this->client->submitForm('Sign in', [ + '_username' => 'doesNotExist@example.com', + '_password' => 'password', + ]); + + $this->assertResponseRedirects('/login'); + $this->client->followRedirect(); + + // Ensure we do not reveal if the user exists or not. + $this->assertSelectorTextContains('.alert-danger', 'Invalid credentials.'); + + // Denied - Can't login with invalid password. + $this->client->request('GET', '/login'); + $this->assertResponseIsSuccessful(); + + $this->client->submitForm('Sign in', [ + '_username' => 'email@example.com', + '_password' => 'bad-password', + ]); + + $this->assertResponseRedirects('/login'); + $this->client->followRedirect(); + + // Ensure we do not reveal the user exists but the password is wrong. + $this->assertSelectorTextContains('.alert-danger', 'Invalid credentials.'); + + // Success - Login with valid credentials is allowed. + $this->client->submitForm('Sign in', [ + '_username' => 'email@example.com', + '_password' => 'password', + ]); + + $this->assertResponseRedirects('/'); + $this->client->followRedirect(); + + $this->assertSelectorNotExists('.alert-danger'); + $this->assertResponseIsSuccessful(); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 47a5855..96185bd 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,12 +1,12 @@ bootEnv(dirname(__DIR__).'/.env'); -} +(new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); if ($_SERVER['APP_DEBUG']) { umask(0000); diff --git a/translations/.gitignore b/translations/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/translations/messages+intl-icu.nl.xlf b/translations/messages+intl-icu.nl.xlf new file mode 100644 index 0000000..edb51e7 --- /dev/null +++ b/translations/messages+intl-icu.nl.xlf @@ -0,0 +1,14 @@ + + + +
+ +
+ + + Enter your name + Voor je naam in + + +
+
+ {% if error %} +
{{ error.messageKey|trans(error.messageData, 'security') }}
+ {% endif %} + + {% if app.user %} +
+ {% endif %} + +

Please sign in

+ + + + + + + + {# + Uncomment this section and add a remember_me option below your firewall to activate remember me functionality. + See https://symfony.com/doc/current/security/remember_me.html + +
+ + +
+ #} + + +