diff --git a/.ddev/config.yaml b/.ddev/config.yaml
index 2f1fa24..987d71f 100644
--- a/.ddev/config.yaml
+++ b/.ddev/config.yaml
@@ -7,8 +7,8 @@ xdebug_enabled: false
additional_hostnames: []
additional_fqdns: []
database:
- type: mariadb
- version: "10.11"
+ type: postgres
+ version: "17"
use_dns_when_possible: true
composer_version: "2"
web_environment: []
diff --git a/.env b/.env
index 84a41ab..5a204fb 100644
--- a/.env
+++ b/.env
@@ -1,26 +1,19 @@
-# In all environments, the following files are loaded if they exist,
-# the latter taking precedence over the former:
-#
-# * .env contains default values for the environment variables needed by the app
-# * .env.local uncommitted file with local overrides
-# * .env.$APP_ENV committed environment-specific defaults
-# * .env.$APP_ENV.local uncommitted environment-specific overrides
-#
-# Real environment variables win over .env files.
-#
-# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
-# https://symfony.com/doc/current/configuration/secrets.html
-#
-# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
-# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
-
-###> symfony/framework-bundle ###
+### SYMFONY
APP_ENV=dev
APP_SECRET=
-###< symfony/framework-bundle ###
+###
-###> symfony/mailer ###
+### MAILER
MAILER_DSN=smtp://${MAILER_USER:-null}:${MAILER_PASSWORD:-null}@${MAILER_HOST:-localhost}:${MAILER_PORT:-1025}
CONTACT_MAIL=${CONTACT_MAIL:-contact@localhost}
SENDER_MAIL=${SENDER_MAIL:-noreply@localhost}
-###< symfony/mailer ###
+###
+
+### DATABASE
+DATABASE_URL="postgresql://${DB_USER:-db}:${DB_PW:-db}@${DB_HOST:-db}:${DB_PORT:-5432}/${DB_NAME:-db}?serverVersion=16&charset=utf8"
+###
+
+### STRIPE
+STRIPE_PUBLIC_KEY=${STRIPE_PUBLIC_KEY}
+STRIPE_SECRET_KEY=${STRIPE_PUBLIC_KEY}
+###
\ No newline at end of file
diff --git a/assets/app.js b/assets/app.js
index 6174cc6..030f427 100644
--- a/assets/app.js
+++ b/assets/app.js
@@ -1,9 +1,2 @@
-/*
- * Welcome to your app's main JavaScript file!
- *
- * This file will be included onto the page via the importmap() Twig function,
- * which should already be in your base.html.twig.
- */
-import './styles/app.css';
-
-console.log('This log comes from assets/app.js - welcome to AssetMapper! 🎉');
+import "./bootstrap.js";
+import "./styles/app.css";
diff --git a/assets/bootstrap.js b/assets/bootstrap.js
new file mode 100644
index 0000000..e0691e2
--- /dev/null
+++ b/assets/bootstrap.js
@@ -0,0 +1,3 @@
+import { startStimulusApp } from "@symfony/stimulus-bundle";
+
+const app = startStimulusApp();
diff --git a/assets/controllers.json b/assets/controllers.json
new file mode 100644
index 0000000..103b202
--- /dev/null
+++ b/assets/controllers.json
@@ -0,0 +1,15 @@
+{
+ "controllers": {
+ "@symfony/ux-turbo": {
+ "turbo-core": {
+ "enabled": true,
+ "fetch": "eager"
+ },
+ "mercure-turbo-stream": {
+ "enabled": false,
+ "fetch": "eager"
+ }
+ }
+ },
+ "entrypoints": []
+}
diff --git a/assets/controllers/csrf_protection_controller.js b/assets/controllers/csrf_protection_controller.js
new file mode 100644
index 0000000..601a088
--- /dev/null
+++ b/assets/controllers/csrf_protection_controller.js
@@ -0,0 +1,117 @@
+const nameCheck = /^[-_a-zA-Z0-9]{4,22}$/;
+const tokenCheck = /^[-_\/+a-zA-Z0-9]{24,}$/;
+
+// Generate and double-submit a CSRF token in a form field and a cookie, as defined by Symfony's SameOriginCsrfTokenManager
+document.addEventListener(
+ "submit",
+ function (event) {
+ generateCsrfToken(event.target);
+ },
+ true,
+);
+
+// When @hotwired/turbo handles form submissions, send the CSRF token in a header in addition to a cookie
+// The `framework.csrf_protection.check_header` config option needs to be enabled for the header to be checked
+document.addEventListener("turbo:submit-start", function (event) {
+ const h = generateCsrfHeaders(event.detail.formSubmission.formElement);
+ Object.keys(h).map(function (k) {
+ event.detail.formSubmission.fetchRequest.headers[k] = h[k];
+ });
+});
+
+// When @hotwired/turbo handles form submissions, remove the CSRF cookie once a form has been submitted
+document.addEventListener("turbo:submit-end", function (event) {
+ removeCsrfToken(event.detail.formSubmission.formElement);
+});
+
+export function generateCsrfToken(formElement) {
+ const csrfField = formElement.querySelector(
+ 'input[data-controller="csrf-protection"], input[name="_csrf_token"]',
+ );
+
+ if (!csrfField) {
+ return;
+ }
+
+ let csrfCookie = csrfField.getAttribute("data-csrf-protection-cookie-value");
+ let csrfToken = csrfField.value;
+
+ if (!csrfCookie && nameCheck.test(csrfToken)) {
+ csrfField.setAttribute(
+ "data-csrf-protection-cookie-value",
+ (csrfCookie = csrfToken),
+ );
+ csrfField.defaultValue = csrfToken = btoa(
+ String.fromCharCode.apply(
+ null,
+ (window.crypto || window.msCrypto).getRandomValues(new Uint8Array(18)),
+ ),
+ );
+ csrfField.dispatchEvent(new Event("change", { bubbles: true }));
+ }
+
+ if (csrfCookie && tokenCheck.test(csrfToken)) {
+ const cookie =
+ csrfCookie +
+ "_" +
+ csrfToken +
+ "=" +
+ csrfCookie +
+ "; path=/; samesite=strict";
+ document.cookie =
+ window.location.protocol === "https:"
+ ? "__Host-" + cookie + "; secure"
+ : cookie;
+ }
+}
+
+export function generateCsrfHeaders(formElement) {
+ const headers = {};
+ const csrfField = formElement.querySelector(
+ 'input[data-controller="csrf-protection"], input[name="_csrf_token"]',
+ );
+
+ if (!csrfField) {
+ return headers;
+ }
+
+ const csrfCookie = csrfField.getAttribute(
+ "data-csrf-protection-cookie-value",
+ );
+
+ if (tokenCheck.test(csrfField.value) && nameCheck.test(csrfCookie)) {
+ headers[csrfCookie] = csrfField.value;
+ }
+
+ return headers;
+}
+
+export function removeCsrfToken(formElement) {
+ const csrfField = formElement.querySelector(
+ 'input[data-controller="csrf-protection"], input[name="_csrf_token"]',
+ );
+
+ if (!csrfField) {
+ return;
+ }
+
+ const csrfCookie = csrfField.getAttribute(
+ "data-csrf-protection-cookie-value",
+ );
+
+ if (tokenCheck.test(csrfField.value) && nameCheck.test(csrfCookie)) {
+ const cookie =
+ csrfCookie +
+ "_" +
+ csrfField.value +
+ "=0; path=/; samesite=strict; max-age=0";
+
+ document.cookie =
+ window.location.protocol === "https:"
+ ? "__Host-" + cookie + "; secure"
+ : cookie;
+ }
+}
+
+/* stimulusFetch: 'lazy' */
+export default "csrf-protection-controller";
diff --git a/assets/controllers/form_controller.js b/assets/controllers/form_controller.js
new file mode 100644
index 0000000..3e157b6
--- /dev/null
+++ b/assets/controllers/form_controller.js
@@ -0,0 +1,204 @@
+import { Controller } from "@hotwired/stimulus";
+import { loadStripe } from "@stripe/stripe-js";
+
+export default class extends Controller {
+ static targets = [
+ "key",
+ "submit",
+ "firstname",
+ "lastname",
+ "email",
+ "phone",
+ "ticketType",
+ "foodType",
+ "note",
+ ];
+
+ stripe;
+
+ async connect() {
+ this.stripe = await loadStripe(this.keyTarget.textContent);
+ }
+
+ addEntry(event) {
+ event.preventDefault();
+
+ const template = this.element
+ .querySelector(".forms")
+ .firstElementChild.cloneNode(true);
+
+ template.querySelectorAll("select, input").forEach((element) => {
+ element.value = "";
+ if (element.id) {
+ element.id = `${element.id}_${Date.now()}`;
+ }
+ });
+
+ template.querySelectorAll("label").forEach((label) => {
+ const forAttribute = label.getAttribute("for");
+ if (forAttribute) {
+ label.setAttribute("for", `${forAttribute}_${Date.now()}`);
+ }
+ });
+
+ template.classList.add("opacity-0");
+ this.element.querySelector(".forms").appendChild(template);
+
+ requestAnimationFrame(() => {
+ template.classList.remove("opacity-0");
+ template.classList.add("transition-all", "duration-300");
+ });
+ }
+
+ removeEntry(event) {
+ event.preventDefault();
+
+ const forms = this.element.querySelector(".forms");
+ if (forms.childElementCount <= 1) {
+ return;
+ }
+
+ const ticketElement = event.currentTarget.closest(".bg-white\\/80");
+ if (!ticketElement) return;
+
+ ticketElement.classList.add("opacity-0", "transition-all", "duration-300");
+ setTimeout(() => {
+ ticketElement.remove();
+ }, 300);
+ }
+
+ submit(event) {
+ event.preventDefault();
+ if (!this.validateForm()) {
+ return;
+ }
+
+ this.submitTarget.querySelector("span").classList.add("hidden");
+ this.submitTarget.querySelector("svg.arrow").classList.add("hidden");
+ this.submitTarget.querySelector("svg.loader").classList.remove("hidden");
+
+ const tickets = this.element.querySelectorAll(".forms > div");
+ const personalData = this.getPersonalData();
+ const ticketData = this.getTicketData(tickets);
+
+ const formData = {
+ personal: personalData,
+ tickets: ticketData,
+ };
+
+ fetch("/ticket/submit", {
+ method: "POST",
+ body: JSON.stringify(formData),
+ headers: {
+ "Content-Type": "application/json",
+ },
+ }).then((response) => {
+ if (!response.ok) {
+ this.submitTarget.querySelector("svg.error").classList.add("hidden");
+ this.submitTarget
+ .querySelector("svg.loader")
+ .classList.remove("hidden");
+ this.submitTarget.querySelector("span").classList.remove("hidden");
+ this.showError(
+ "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.",
+ );
+ } else {
+ response.json().then((data) => {
+ this.stripe.redirectToCheckout({
+ sessionId: data.id,
+ });
+ });
+ }
+ });
+ }
+
+ validateForm() {
+ let isValid = true;
+
+ ["firstname", "lastname", "email"].forEach((field) => {
+ const target = this[`${field}Target`];
+ if (!target.value.trim()) {
+ this.showFieldError(target);
+ isValid = false;
+ }
+ });
+
+ this.element.querySelectorAll(".forms > div").forEach((ticket) => {
+ const selects = ticket.querySelectorAll("select[required]");
+ selects.forEach((select) => {
+ if (!select.value) {
+ this.showFieldError(select);
+ isValid = false;
+ }
+ });
+ });
+
+ return isValid;
+ }
+
+ showFieldError(element) {
+ element.classList.add(
+ "border-red-500",
+ "focus:border-red-500",
+ "focus:ring-red-200",
+ );
+ element.addEventListener(
+ "input",
+ () => {
+ element.classList.remove(
+ "border-red-500",
+ "focus:border-red-500",
+ "focus:ring-red-200",
+ );
+ },
+ { once: true },
+ );
+ }
+
+ showError(message) {
+ const errorDiv = document.createElement("div");
+ errorDiv.className =
+ "fixed top-4 right-4 bg-red-50 border-l-4 border-red-500 p-4 rounded shadow-lg transform transition-all duration-500 opacity-0 translate-x-4";
+ errorDiv.innerHTML = `
+
+ `;
+
+ document.body.appendChild(errorDiv);
+ requestAnimationFrame(() => {
+ errorDiv.classList.remove("opacity-0", "translate-x-4");
+ });
+
+ setTimeout(() => {
+ errorDiv.classList.add("opacity-0", "translate-x-4");
+ setTimeout(() => errorDiv.remove(), 500);
+ }, 5000);
+ }
+
+ getTicketData(tickets) {
+ return Array.from(tickets).map((ticket) => this.extractTicketData(ticket));
+ }
+
+ getPersonalData() {
+ return {
+ firstname: this.firstnameTarget.value.trim(),
+ lastname: this.lastnameTarget.value.trim(),
+ email: this.emailTarget.value.trim(),
+ phone: this.phoneTarget.value.trim(),
+ };
+ }
+
+ extractTicketData(ticket) {
+ return {
+ ticket: parseInt(ticket.querySelector('select[name="ticket"]').value),
+ food: parseInt(ticket.querySelector('select[name="food"]').value),
+ note: ticket.querySelector('input[name="note"]').value.trim(),
+ };
+ }
+}
diff --git a/assets/icons/delete.svg b/assets/icons/delete.svg
new file mode 100644
index 0000000..c90ee5e
--- /dev/null
+++ b/assets/icons/delete.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/loader.svg b/assets/icons/loader.svg
new file mode 100644
index 0000000..6655b55
--- /dev/null
+++ b/assets/icons/loader.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/plus.svg b/assets/icons/plus.svg
new file mode 100644
index 0000000..0488d68
--- /dev/null
+++ b/assets/icons/plus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/styles/app.css b/assets/styles/app.css
index a90f074..f5756ba 100644
--- a/assets/styles/app.css
+++ b/assets/styles/app.css
@@ -2,3 +2,10 @@
@tailwind components;
@tailwind utilities;
+.text-input {
+ @apply border border-gray-300 rounded-lg focus:ring-2 focus:ring-orange-500 outline-orange-500 focus:border-orange-500 transition-colors;
+}
+
+option:disabled {
+ display: none;
+}
diff --git a/composer.json b/composer.json
index 35a8412..d1506a7 100644
--- a/composer.json
+++ b/composer.json
@@ -7,7 +7,14 @@
"php": ">=8.2",
"ext-ctype": "*",
"ext-iconv": "*",
+ "doctrine/annotations": "^2.0",
+ "doctrine/dbal": "^3",
+ "doctrine/doctrine-bundle": "^2.13",
+ "doctrine/doctrine-migrations-bundle": "^3.4",
+ "doctrine/orm": "^3.3",
"php-flasher/flasher-noty-symfony": "^2.1",
+ "phpdocumentor/reflection-docblock": "^5.6",
+ "stripe/stripe-php": "^16.4",
"symfony/asset": "7.2.*",
"symfony/asset-mapper": "7.2.*",
"symfony/console": "7.2.*",
@@ -16,8 +23,15 @@
"symfony/form": "7.2.*",
"symfony/framework-bundle": "7.2.*",
"symfony/mailer": "7.2.*",
+ "symfony/property-access": "7.2.*",
+ "symfony/property-info": "7.2.*",
"symfony/runtime": "7.2.*",
+ "symfony/serializer": "7.2.*",
"symfony/twig-bundle": "7.2.*",
+ "symfony/ux-icons": "^2.22",
+ "symfony/ux-turbo": "^2.22",
+ "symfony/ux-twig-component": "^2.22",
+ "symfony/validator": "7.2.*",
"symfony/yaml": "7.2.*",
"symfonycasts/tailwind-bundle": "^0.7.1",
"twig/extra-bundle": "^2.12|^3.0",
diff --git a/composer.lock b/composer.lock
index b7b09de..61a72ee 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": "07f3e1f4e3dd83a7699548913d63ba48",
+ "content-hash": "8dc2a9d9e624cf61b3c68d2678e9d53c",
"packages": [
{
"name": "composer/semver",
@@ -87,6 +87,875 @@
],
"time": "2024-09-19T14:15:21+00:00"
},
+ {
+ "name": "doctrine/annotations",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7",
+ "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^2 || ^3",
+ "ext-tokenizer": "*",
+ "php": "^7.2 || ^8.0",
+ "psr/cache": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "doctrine/cache": "^2.0",
+ "doctrine/coding-standard": "^10",
+ "phpstan/phpstan": "^1.10.28",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "symfony/cache": "^5.4 || ^6.4 || ^7",
+ "vimeo/psalm": "^4.30 || ^5.14"
+ },
+ "suggest": {
+ "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Docblock Annotations Parser",
+ "homepage": "https://www.doctrine-project.org/projects/annotations.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "parser"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/annotations/issues",
+ "source": "https://github.com/doctrine/annotations/tree/2.0.2"
+ },
+ "time": "2024-09-05T10:17:24+00:00"
+ },
+ {
+ "name": "doctrine/cache",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/cache.git",
+ "reference": "1ca8f21980e770095a31456042471a57bc4c68fb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb",
+ "reference": "1ca8f21980e770095a31456042471a57bc4c68fb",
+ "shasum": ""
+ },
+ "require": {
+ "php": "~7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/common": ">2.2,<2.4"
+ },
+ "require-dev": {
+ "cache/integration-tests": "dev-master",
+ "doctrine/coding-standard": "^9",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "symfony/cache": "^4.4 || ^5.4 || ^6",
+ "symfony/var-exporter": "^4.4 || ^5.4 || ^6"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.",
+ "homepage": "https://www.doctrine-project.org/projects/cache.html",
+ "keywords": [
+ "abstraction",
+ "apcu",
+ "cache",
+ "caching",
+ "couchdb",
+ "memcached",
+ "php",
+ "redis",
+ "xcache"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/cache/issues",
+ "source": "https://github.com/doctrine/cache/tree/2.2.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%2Fcache",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-20T20:07:39+00:00"
+ },
+ {
+ "name": "doctrine/collections",
+ "version": "2.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/collections.git",
+ "reference": "d8af7f248c74f195f7347424600fd9e17b57af59"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59",
+ "reference": "d8af7f248c74f195f7347424600fd9e17b57af59",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "ext-json": "*",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^10.5",
+ "vimeo/psalm": "^5.11"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Collections\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.",
+ "homepage": "https://www.doctrine-project.org/projects/collections.html",
+ "keywords": [
+ "array",
+ "collections",
+ "iterators",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/collections/issues",
+ "source": "https://github.com/doctrine/collections/tree/2.2.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%2Fcollections",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T06:56:21+00:00"
+ },
+ {
+ "name": "doctrine/dbal",
+ "version": "3.9.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/dbal.git",
+ "reference": "ec16c82f20be1a7224e65ac67144a29199f87959"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/ec16c82f20be1a7224e65ac67144a29199f87959",
+ "reference": "ec16c82f20be1a7224e65ac67144a29199f87959",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2",
+ "doctrine/cache": "^1.11|^2.0",
+ "doctrine/deprecations": "^0.5.3|^1",
+ "doctrine/event-manager": "^1|^2",
+ "php": "^7.4 || ^8.0",
+ "psr/cache": "^1|^2|^3",
+ "psr/log": "^1|^2|^3"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "12.0.0",
+ "fig/log-test": "^1",
+ "jetbrains/phpstorm-stubs": "2023.1",
+ "phpstan/phpstan": "2.1.1",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "9.6.22",
+ "slevomat/coding-standard": "8.13.1",
+ "squizlabs/php_codesniffer": "3.10.2",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/console": "^4.4|^5.4|^6.0|^7.0"
+ },
+ "suggest": {
+ "symfony/console": "For helpful console commands such as SQL execution and import of files."
+ },
+ "bin": [
+ "bin/doctrine-dbal"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\DBAL\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ }
+ ],
+ "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.",
+ "homepage": "https://www.doctrine-project.org/projects/dbal.html",
+ "keywords": [
+ "abstraction",
+ "database",
+ "db2",
+ "dbal",
+ "mariadb",
+ "mssql",
+ "mysql",
+ "oci8",
+ "oracle",
+ "pdo",
+ "pgsql",
+ "postgresql",
+ "queryobject",
+ "sasql",
+ "sql",
+ "sqlite",
+ "sqlserver",
+ "sqlsrv"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/dbal/issues",
+ "source": "https://github.com/doctrine/dbal/tree/3.9.4"
+ },
+ "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%2Fdbal",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-16T08:28:55+00:00"
+ },
+ {
+ "name": "doctrine/deprecations",
+ "version": "1.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/deprecations.git",
+ "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9",
+ "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^12",
+ "phpstan/phpstan": "1.4.10 || 2.0.3",
+ "phpstan/phpstan-phpunit": "^1.0 || ^2",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "suggest": {
+ "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Deprecations\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+ "homepage": "https://www.doctrine-project.org/",
+ "support": {
+ "issues": "https://github.com/doctrine/deprecations/issues",
+ "source": "https://github.com/doctrine/deprecations/tree/1.1.4"
+ },
+ "time": "2024-12-07T21:18:45+00:00"
+ },
+ {
+ "name": "doctrine/doctrine-bundle",
+ "version": "2.13.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/DoctrineBundle.git",
+ "reference": "2363c43d9815a11657e452625cd64172d5587486"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/2363c43d9815a11657e452625cd64172d5587486",
+ "reference": "2363c43d9815a11657e452625cd64172d5587486",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/cache": "^1.11 || ^2.0",
+ "doctrine/dbal": "^3.7.0 || ^4.0",
+ "doctrine/persistence": "^2.2 || ^3",
+ "doctrine/sql-formatter": "^1.0.1",
+ "php": "^7.4 || ^8.0",
+ "symfony/cache": "^5.4 || ^6.0 || ^7.0",
+ "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.46 || ~6.3.12 || ^6.4.3 || ^7.0.3",
+ "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3"
+ },
+ "conflict": {
+ "doctrine/annotations": ">=3.0",
+ "doctrine/orm": "<2.17 || >=4.0",
+ "twig/twig": "<1.34 || >=2.0 <2.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1 || ^2",
+ "doctrine/coding-standard": "^12",
+ "doctrine/deprecations": "^1.0",
+ "doctrine/orm": "^2.17 || ^3.0",
+ "friendsofphp/proxy-manager-lts": "^1.0",
+ "phpstan/phpstan": "2.1.1",
+ "phpstan/phpstan-phpunit": "2.0.3",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^9.5.26",
+ "psr/log": "^1.1.4 || ^2.0 || ^3.0",
+ "symfony/phpunit-bridge": "^6.1 || ^7.0",
+ "symfony/property-info": "^5.4 || ^6.0 || ^7.0",
+ "symfony/proxy-manager-bridge": "^5.4 || ^6.0",
+ "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0",
+ "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0",
+ "symfony/string": "^5.4 || ^6.0 || ^7.0",
+ "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0",
+ "symfony/validator": "^5.4 || ^6.0 || ^7.0",
+ "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0",
+ "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0",
+ "symfony/yaml": "^5.4 || ^6.0 || ^7.0",
+ "twig/twig": "^1.34 || ^2.12 || ^3.0"
+ },
+ "suggest": {
+ "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.",
+ "ext-pdo": "*",
+ "symfony/web-profiler-bundle": "To use the data collector."
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Bundle\\DoctrineBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ },
+ {
+ "name": "Doctrine Project",
+ "homepage": "https://www.doctrine-project.org/"
+ }
+ ],
+ "description": "Symfony DoctrineBundle",
+ "homepage": "https://www.doctrine-project.org",
+ "keywords": [
+ "database",
+ "dbal",
+ "orm",
+ "persistence"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/DoctrineBundle/issues",
+ "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.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%2Fdoctrine-bundle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-15T11:12:38+00:00"
+ },
+ {
+ "name": "doctrine/doctrine-migrations-bundle",
+ "version": "3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git",
+ "reference": "a5c5fe0d2c6b911c03555046febb05a05a347078"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/a5c5fe0d2c6b911c03555046febb05a05a347078",
+ "reference": "a5c5fe0d2c6b911c03555046febb05a05a347078",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/doctrine-bundle": "^2.4",
+ "doctrine/migrations": "^3.2",
+ "php": "^7.2 || ^8.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3",
+ "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "composer/semver": "^3.0",
+ "doctrine/coding-standard": "^12",
+ "doctrine/orm": "^2.6 || ^3",
+ "doctrine/persistence": "^2.0 || ^3",
+ "phpstan/phpstan": "^1.4 || ^2",
+ "phpstan/phpstan-deprecation-rules": "^1 || ^2",
+ "phpstan/phpstan-phpunit": "^1 || ^2",
+ "phpstan/phpstan-strict-rules": "^1.1 || ^2",
+ "phpstan/phpstan-symfony": "^1.3 || ^2",
+ "phpunit/phpunit": "^8.5 || ^9.5",
+ "symfony/phpunit-bridge": "^6.3 || ^7",
+ "symfony/var-exporter": "^5.4 || ^6 || ^7"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Bundle\\MigrationsBundle\\": "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 DoctrineMigrationsBundle",
+ "homepage": "https://www.doctrine-project.org",
+ "keywords": [
+ "dbal",
+ "migrations",
+ "schema"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues",
+ "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.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-migrations-bundle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-16T20:28:10+00:00"
+ },
+ {
+ "name": "doctrine/event-manager",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/event-manager.git",
+ "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e",
+ "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "conflict": {
+ "doctrine/common": "<2.9"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.8.8",
+ "phpunit/phpunit": "^10.5",
+ "vimeo/psalm": "^5.24"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.",
+ "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
+ "keywords": [
+ "event",
+ "event dispatcher",
+ "event manager",
+ "event system",
+ "events"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/event-manager/issues",
+ "source": "https://github.com/doctrine/event-manager/tree/2.0.1"
+ },
+ "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%2Fevent-manager",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-22T20:47:39+00:00"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "2.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11.0",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.3",
+ "phpunit/phpunit": "^8.5 || ^9.5",
+ "vimeo/psalm": "^4.25 || ^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+ "keywords": [
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/inflector/issues",
+ "source": "https://github.com/doctrine/inflector/tree/2.0.10"
+ },
+ "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%2Finflector",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-18T20:23:39+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.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%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:23:10+00:00"
+ },
{
"name": "doctrine/lexer",
"version": "3.0.1",
@@ -164,6 +1033,351 @@
],
"time": "2024-02-05T11:56:58+00:00"
},
+ {
+ "name": "doctrine/migrations",
+ "version": "3.8.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/migrations.git",
+ "reference": "5007eb1168691225ac305fe16856755c20860842"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/migrations/zipball/5007eb1168691225ac305fe16856755c20860842",
+ "reference": "5007eb1168691225ac305fe16856755c20860842",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2",
+ "doctrine/dbal": "^3.6 || ^4",
+ "doctrine/deprecations": "^0.5.3 || ^1",
+ "doctrine/event-manager": "^1.2 || ^2.0",
+ "php": "^8.1",
+ "psr/log": "^1.1.3 || ^2 || ^3",
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0",
+ "symfony/var-exporter": "^6.2 || ^7.0"
+ },
+ "conflict": {
+ "doctrine/orm": "<2.12 || >=4"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "doctrine/orm": "^2.13 || ^3",
+ "doctrine/persistence": "^2 || ^3",
+ "doctrine/sql-formatter": "^1.0",
+ "ext-pdo_sqlite": "*",
+ "fig/log-test": "^1",
+ "phpstan/phpstan": "^1.10",
+ "phpstan/phpstan-deprecation-rules": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpstan/phpstan-strict-rules": "^1.4",
+ "phpstan/phpstan-symfony": "^1.3",
+ "phpunit/phpunit": "^10.3",
+ "symfony/cache": "^5.4 || ^6.0 || ^7.0",
+ "symfony/process": "^5.4 || ^6.0 || ^7.0",
+ "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
+ },
+ "suggest": {
+ "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.",
+ "symfony/yaml": "Allows the use of yaml for migration configuration files."
+ },
+ "bin": [
+ "bin/doctrine-migrations"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Migrations\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Michael Simonson",
+ "email": "contact@mikesimonson.com"
+ }
+ ],
+ "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.",
+ "homepage": "https://www.doctrine-project.org/projects/migrations.html",
+ "keywords": [
+ "database",
+ "dbal",
+ "migrations"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/migrations/issues",
+ "source": "https://github.com/doctrine/migrations/tree/3.8.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%2Fmigrations",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-10T21:35:27+00:00"
+ },
+ {
+ "name": "doctrine/orm",
+ "version": "3.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/orm.git",
+ "reference": "b1f8253105aa5382c495e5f9f8ef34e297775428"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/orm/zipball/b1f8253105aa5382c495e5f9f8ef34e297775428",
+ "reference": "b1f8253105aa5382c495e5f9f8ef34e297775428",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2",
+ "doctrine/collections": "^2.2",
+ "doctrine/dbal": "^3.8.2 || ^4",
+ "doctrine/deprecations": "^0.5.3 || ^1",
+ "doctrine/event-manager": "^1.2 || ^2",
+ "doctrine/inflector": "^1.4 || ^2.0",
+ "doctrine/instantiator": "^1.3 || ^2",
+ "doctrine/lexer": "^3",
+ "doctrine/persistence": "^3.3.1 || ^4",
+ "ext-ctype": "*",
+ "php": "^8.1",
+ "psr/cache": "^1 || ^2 || ^3",
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/var-exporter": "^6.3.9 || ^7.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12.0",
+ "phpbench/phpbench": "^1.0",
+ "phpdocumentor/guides-cli": "^1.4",
+ "phpstan/extension-installer": "^1.4",
+ "phpstan/phpstan": "2.0.3",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpunit/phpunit": "^10.4.0",
+ "psr/log": "^1 || ^2 || ^3",
+ "squizlabs/php_codesniffer": "3.7.2",
+ "symfony/cache": "^5.4 || ^6.2 || ^7.0"
+ },
+ "suggest": {
+ "ext-dom": "Provides support for XSD validation for XML mapping files",
+ "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\ORM\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "Object-Relational-Mapper for PHP",
+ "homepage": "https://www.doctrine-project.org/projects/orm.html",
+ "keywords": [
+ "database",
+ "orm"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/orm/issues",
+ "source": "https://github.com/doctrine/orm/tree/3.3.1"
+ },
+ "time": "2024-12-19T07:08:14+00:00"
+ },
+ {
+ "name": "doctrine/persistence",
+ "version": "3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/persistence.git",
+ "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/persistence/zipball/0ea965320cec355dba75031c1b23d4c78362e3ff",
+ "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/event-manager": "^1 || ^2",
+ "php": "^7.2 || ^8.0",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0"
+ },
+ "conflict": {
+ "doctrine/common": "<2.10"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "doctrine/common": "^3.0",
+ "phpstan/phpstan": "1.12.7",
+ "phpstan/phpstan-phpunit": "^1",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^8.5.38 || ^9.5",
+ "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Persistence\\": "src/Persistence"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.",
+ "homepage": "https://www.doctrine-project.org/projects/persistence.html",
+ "keywords": [
+ "mapper",
+ "object",
+ "odm",
+ "orm",
+ "persistence"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/persistence/issues",
+ "source": "https://github.com/doctrine/persistence/tree/3.4.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%2Fpersistence",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-30T19:48:12+00:00"
+ },
+ {
+ "name": "doctrine/sql-formatter",
+ "version": "1.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/sql-formatter.git",
+ "reference": "b784cbde727cf806721451dde40eff4fec3bbe86"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/b784cbde727cf806721451dde40eff4fec3bbe86",
+ "reference": "b784cbde727cf806721451dde40eff4fec3bbe86",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "ergebnis/phpunit-slow-test-detector": "^2.14",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
+ "vimeo/psalm": "^5.24"
+ },
+ "bin": [
+ "bin/sql-formatter"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\SqlFormatter\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jeremy Dorn",
+ "email": "jeremy@jeremydorn.com",
+ "homepage": "https://jeremydorn.com/"
+ }
+ ],
+ "description": "a PHP SQL highlighting library",
+ "homepage": "https://github.com/doctrine/sql-formatter/",
+ "keywords": [
+ "highlight",
+ "sql"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/sql-formatter/issues",
+ "source": "https://github.com/doctrine/sql-formatter/tree/1.5.1"
+ },
+ "time": "2024-10-21T18:21:57+00:00"
+ },
{
"name": "egulias/email-validator",
"version": "4.0.3",
@@ -507,6 +1721,228 @@
],
"time": "2025-01-18T10:26:31+00:00"
},
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
+ "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.1",
+ "ext-filter": "*",
+ "php": "^7.4 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.7",
+ "phpstan/phpdoc-parser": "^1.7|^2.0",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.5 || ~1.6.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-webmozart-assert": "^1.2",
+ "phpunit/phpunit": "^9.5",
+ "psalm/phar": "^5.26"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1"
+ },
+ "time": "2024-12-07T09:39:29+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.0",
+ "php": "^7.3 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpstan/phpdoc-parser": "^1.18|^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpunit/phpunit": "^9.5",
+ "rector/rector": "^0.13.9",
+ "vimeo/psalm": "^4.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0"
+ },
+ "time": "2024-11-09T15:12:26+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299",
+ "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^5.3.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0"
+ },
+ "time": "2024-10-13T11:29:49+00:00"
+ },
{
"name": "psr/cache",
"version": "3.0.0",
@@ -709,6 +2145,65 @@
},
"time": "2024-09-11T13:17:53+00:00"
},
+ {
+ "name": "stripe/stripe-php",
+ "version": "v16.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/stripe/stripe-php.git",
+ "reference": "4aa86099f888db9368f5f778f29feb14e6294dfb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/stripe/stripe-php/zipball/4aa86099f888db9368f5f778f29feb14e6294dfb",
+ "reference": "4aa86099f888db9368f5f778f29feb14e6294dfb",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "3.5.0",
+ "phpstan/phpstan": "^1.2",
+ "phpunit/phpunit": "^5.7 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Stripe\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Stripe and contributors",
+ "homepage": "https://github.com/stripe/stripe-php/contributors"
+ }
+ ],
+ "description": "Stripe PHP Library",
+ "homepage": "https://stripe.com/",
+ "keywords": [
+ "api",
+ "payment processing",
+ "stripe"
+ ],
+ "support": {
+ "issues": "https://github.com/stripe/stripe-php/issues",
+ "source": "https://github.com/stripe/stripe-php/tree/v16.4.0"
+ },
+ "time": "2024-12-18T23:42:15+00:00"
+ },
{
"name": "symfony/asset",
"version": "v7.2.0",
@@ -1346,6 +2841,115 @@
],
"time": "2024-09-25T14:20:29+00:00"
},
+ {
+ "name": "symfony/doctrine-bridge",
+ "version": "v7.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/doctrine-bridge.git",
+ "reference": "f12195479a55b77bc8427b48443b966622f4a18b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/f12195479a55b77bc8427b48443b966622f4a18b",
+ "reference": "f12195479a55b77bc8427b48443b966622f4a18b",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/event-manager": "^2",
+ "doctrine/persistence": "^3.1",
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.8",
+ "doctrine/dbal": "<3.6",
+ "doctrine/lexer": "<1.1",
+ "doctrine/orm": "<2.15",
+ "symfony/cache": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/form": "<6.4.6|>=7,<7.0.6",
+ "symfony/http-foundation": "<6.4",
+ "symfony/http-kernel": "<6.4",
+ "symfony/lock": "<6.4",
+ "symfony/messenger": "<6.4",
+ "symfony/property-info": "<6.4",
+ "symfony/security-bundle": "<6.4",
+ "symfony/security-core": "<6.4",
+ "symfony/validator": "<6.4"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.8|^2.0",
+ "doctrine/data-fixtures": "^1.1|^2",
+ "doctrine/dbal": "^3.6|^4",
+ "doctrine/orm": "^2.15|^3",
+ "psr/log": "^1|^2|^3",
+ "symfony/cache": "^6.4|^7.0",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/doctrine-messenger": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/form": "^6.4.6|^7.0.6",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/property-access": "^6.4|^7.0",
+ "symfony/property-info": "^6.4|^7.0",
+ "symfony/security-core": "^6.4|^7.0",
+ "symfony/stopwatch": "^6.4|^7.0",
+ "symfony/translation": "^6.4|^7.0",
+ "symfony/type-info": "^7.1",
+ "symfony/uid": "^6.4|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "type": "symfony-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\Doctrine\\": ""
+ },
+ "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 integration for Doctrine with various Symfony components",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/doctrine-bridge/tree/v7.2.2"
+ },
+ "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-12-19T14:25:03+00:00"
+ },
{
"name": "symfony/dotenv",
"version": "v7.2.0",
@@ -3237,16 +4841,16 @@
},
{
"name": "symfony/property-access",
- "version": "v7.2.0",
+ "version": "v7.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-access.git",
- "reference": "3ae42efba01e45aaedecf5c93c8d6a3ab3a82276"
+ "reference": "b28732e315d81fbec787f838034de7d6c9b2b902"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/property-access/zipball/3ae42efba01e45aaedecf5c93c8d6a3ab3a82276",
- "reference": "3ae42efba01e45aaedecf5c93c8d6a3ab3a82276",
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/b28732e315d81fbec787f838034de7d6c9b2b902",
+ "reference": "b28732e315d81fbec787f838034de7d6c9b2b902",
"shasum": ""
},
"require": {
@@ -3293,7 +4897,7 @@
"reflection"
],
"support": {
- "source": "https://github.com/symfony/property-access/tree/v7.2.0"
+ "source": "https://github.com/symfony/property-access/tree/v7.2.3"
},
"funding": [
{
@@ -3309,20 +4913,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-26T12:28:35+00:00"
+ "time": "2025-01-17T10:56:55+00:00"
},
{
"name": "symfony/property-info",
- "version": "v7.2.2",
+ "version": "v7.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-info.git",
- "reference": "1dfeb0dac7a99f7b3be42db9ccc299c5a6483fcf"
+ "reference": "dedb118fd588a92f226b390250b384d25f4192fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/property-info/zipball/1dfeb0dac7a99f7b3be42db9ccc299c5a6483fcf",
- "reference": "1dfeb0dac7a99f7b3be42db9ccc299c5a6483fcf",
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/dedb118fd588a92f226b390250b384d25f4192fe",
+ "reference": "dedb118fd588a92f226b390250b384d25f4192fe",
"shasum": ""
},
"require": {
@@ -3333,7 +4937,9 @@
"conflict": {
"phpdocumentor/reflection-docblock": "<5.2",
"phpdocumentor/type-resolver": "<1.5.1",
- "symfony/dependency-injection": "<6.4"
+ "symfony/cache": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/serializer": "<6.4"
},
"require-dev": {
"phpdocumentor/reflection-docblock": "^5.2",
@@ -3376,7 +4982,7 @@
"validator"
],
"support": {
- "source": "https://github.com/symfony/property-info/tree/v7.2.2"
+ "source": "https://github.com/symfony/property-info/tree/v7.2.3"
},
"funding": [
{
@@ -3392,7 +4998,7 @@
"type": "tidelift"
}
],
- "time": "2024-12-31T11:04:50+00:00"
+ "time": "2025-01-27T11:08:17+00:00"
},
{
"name": "symfony/routing",
@@ -3554,6 +5160,104 @@
],
"time": "2024-11-06T11:43:25+00:00"
},
+ {
+ "name": "symfony/serializer",
+ "version": "v7.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/serializer.git",
+ "reference": "320f30beb419ce4f96363ada5e225c41f1ef08ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/serializer/zipball/320f30beb419ce4f96363ada5e225c41f1ef08ab",
+ "reference": "320f30beb419ce4f96363ada5e225c41f1ef08ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/property-access": "<6.4",
+ "symfony/property-info": "<6.4",
+ "symfony/uid": "<6.4",
+ "symfony/validator": "<6.4",
+ "symfony/yaml": "<6.4"
+ },
+ "require-dev": {
+ "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0",
+ "phpstan/phpdoc-parser": "^1.0|^2.0",
+ "seld/jsonlint": "^1.10",
+ "symfony/cache": "^6.4|^7.0",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/dependency-injection": "^7.2",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/filesystem": "^6.4|^7.0",
+ "symfony/form": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/messenger": "^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-contracts": "^2.5|^3",
+ "symfony/type-info": "^7.1",
+ "symfony/uid": "^6.4|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0",
+ "symfony/var-exporter": "^6.4|^7.0",
+ "symfony/yaml": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Serializer\\": ""
+ },
+ "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": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/serializer/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-29T07:13:55+00:00"
+ },
{
"name": "symfony/service-contracts",
"version": "v3.5.1",
@@ -3637,6 +5341,137 @@
],
"time": "2024-09-25T14:20:29+00:00"
},
+ {
+ "name": "symfony/stimulus-bundle",
+ "version": "v2.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stimulus-bundle.git",
+ "reference": "e13034d428354023c82a1db108d40fdf6cec2d36"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/e13034d428354023c82a1db108d40fdf6cec2d36",
+ "reference": "e13034d428354023c82a1db108d40fdf6cec2d36",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/deprecation-contracts": "^2.0|^3.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "twig/twig": "^2.15.3|^3.8"
+ },
+ "require-dev": {
+ "symfony/asset-mapper": "^6.3|^7.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0",
+ "zenstruck/browser": "^1.4"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\StimulusBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Integration with your Symfony app & Stimulus!",
+ "keywords": [
+ "symfony-ux"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/stimulus-bundle/tree/v2.22.1"
+ },
+ "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-12-06T14:30:33+00:00"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v7.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df",
+ "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Stopwatch\\": ""
+ },
+ "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 way to profile code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/stopwatch/tree/v7.2.2"
+ },
+ "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-12-18T14:28:33+00:00"
+ },
{
"name": "symfony/string",
"version": "v7.2.0",
@@ -4071,6 +5906,373 @@
],
"time": "2024-12-20T13:38:37+00:00"
},
+ {
+ "name": "symfony/ux-icons",
+ "version": "v2.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-icons.git",
+ "reference": "3a6fd4293fc200530b09960c41941a71354bc5fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-icons/zipball/3a6fd4293fc200530b09960c41941a71354bc5fc",
+ "reference": "3a6fd4293fc200530b09960c41941a71354bc5fc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/twig-bundle": "^6.4|^7.0"
+ },
+ "conflict": {
+ "symfony/flex": "<1.13",
+ "symfony/ux-twig-component": "<2.21"
+ },
+ "require-dev": {
+ "psr/log": "^2|^3",
+ "symfony/asset-mapper": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/http-client": "6.4|^7.0",
+ "symfony/phpunit-bridge": "^6.3|^7.0",
+ "symfony/ux-twig-component": "^2.14",
+ "zenstruck/console-test": "^1.5"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Icons\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kevin Bond",
+ "email": "kevinbond@gmail.com"
+ },
+ {
+ "name": "Simon André",
+ "email": "smn.andre@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Renders local and remote SVG icons in your Twig templates.",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "icons",
+ "svg",
+ "symfony-ux",
+ "twig"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-icons/tree/v2.22.1"
+ },
+ "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-12-04T11:34:13+00:00"
+ },
+ {
+ "name": "symfony/ux-turbo",
+ "version": "v2.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-turbo.git",
+ "reference": "97718ea4bca26f0db843c3c0de338d6900c5a002"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/97718ea4bca26f0db843c3c0de338d6900c5a002",
+ "reference": "97718ea4bca26f0db843c3c0de338d6900c5a002",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/stimulus-bundle": "^2.9.1"
+ },
+ "conflict": {
+ "symfony/flex": "<1.13"
+ },
+ "require-dev": {
+ "dbrekelmans/bdi": "dev-main",
+ "doctrine/doctrine-bundle": "^2.4.3",
+ "doctrine/orm": "^2.8 | 3.0",
+ "phpstan/phpstan": "^1.10",
+ "symfony/asset-mapper": "^6.4|^7.0",
+ "symfony/debug-bundle": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/form": "^5.4|^6.0|^7.0",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/mercure-bundle": "^0.3.7",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/panther": "^2.1",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|6.3.*|^7.0",
+ "symfony/property-access": "^5.4|^6.0|^7.0",
+ "symfony/security-core": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/twig-bundle": "^6.4|^7.0",
+ "symfony/ux-twig-component": "^2.21",
+ "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Turbo\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kévin Dunglas",
+ "email": "kevin@dunglas.fr"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Hotwire Turbo integration for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "hotwire",
+ "javascript",
+ "mercure",
+ "symfony-ux",
+ "turbo",
+ "turbo-stream"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-turbo/tree/v2.22.1"
+ },
+ "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-12-05T14:25:02+00:00"
+ },
+ {
+ "name": "symfony/ux-twig-component",
+ "version": "v2.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-twig-component.git",
+ "reference": "9b347f6ca2d9e18cee630787f0a6aa453982bf18"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/9b347f6ca2d9e18cee630787f0a6aa453982bf18",
+ "reference": "9b347f6ca2d9e18cee630787f0a6aa453982bf18",
+ "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.22.1"
+ },
+ "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-12-07T18:05:50+00:00"
+ },
+ {
+ "name": "symfony/validator",
+ "version": "v7.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/validator.git",
+ "reference": "6faf9f671d522b76ce87e46a1d2d7740b4385c6f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/6faf9f671d522b76ce87e46a1d2d7740b4385c6f",
+ "reference": "6faf9f671d522b76ce87e46a1d2d7740b4385c6f",
+ "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.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-28T15:51:35+00:00"
+ },
{
"name": "symfony/var-dumper",
"version": "v7.2.0",
@@ -4510,38 +6712,41 @@
}
],
"time": "2024-12-29T10:51:50+00:00"
- }
- ],
- "packages-dev": [
+ },
{
- "name": "doctrine/inflector",
- "version": "2.0.10",
+ "name": "webmozart/assert",
+ "version": "1.11.0",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/inflector.git",
- "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
- "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
"shasum": ""
},
"require": {
+ "ext-ctype": "*",
"php": "^7.2 || ^8.0"
},
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
"require-dev": {
- "doctrine/coding-standard": "^11.0",
- "phpstan/phpstan": "^1.8",
- "phpstan/phpstan-phpunit": "^1.1",
- "phpstan/phpstan-strict-rules": "^1.3",
- "phpunit/phpunit": "^8.5 || ^9.5",
- "vimeo/psalm": "^4.25 || ^5.4"
+ "phpunit/phpunit": "^8.5.13"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
"autoload": {
"psr-4": {
- "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
+ "Webmozart\\Assert\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4550,60 +6755,24 @@
],
"authors": [
{
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
}
],
- "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
- "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+ "description": "Assertions to validate method input/output with nice error messages.",
"keywords": [
- "inflection",
- "inflector",
- "lowercase",
- "manipulation",
- "php",
- "plural",
- "singular",
- "strings",
- "uppercase",
- "words"
+ "assert",
+ "check",
+ "validate"
],
"support": {
- "issues": "https://github.com/doctrine/inflector/issues",
- "source": "https://github.com/doctrine/inflector/tree/2.0.10"
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.11.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%2Finflector",
- "type": "tidelift"
- }
- ],
- "time": "2024-02-18T20:23:39+00:00"
- },
+ "time": "2022-06-03T18:03:27+00:00"
+ }
+ ],
+ "packages-dev": [
{
"name": "nikic/php-parser",
"version": "v5.4.0",
@@ -4754,68 +6923,6 @@
],
"time": "2025-01-15T00:21:40+00:00"
},
- {
- "name": "symfony/stopwatch",
- "version": "v7.2.2",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/stopwatch.git",
- "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df",
- "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df",
- "shasum": ""
- },
- "require": {
- "php": ">=8.2",
- "symfony/service-contracts": "^2.5|^3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Stopwatch\\": ""
- },
- "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 way to profile code",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/stopwatch/tree/v7.2.2"
- },
- "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-12-18T14:28:33+00:00"
- },
{
"name": "symfony/web-profiler-bundle",
"version": "v7.2.2",
@@ -4901,7 +7008,7 @@
],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": [],
+ "stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
@@ -4909,6 +7016,6 @@
"ext-ctype": "*",
"ext-iconv": "*"
},
- "platform-dev": [],
+ "platform-dev": {},
"plugin-api-version": "2.6.0"
}
diff --git a/config/bundles.php b/config/bundles.php
index 9f74ebd..6bf095b 100644
--- a/config/bundles.php
+++ b/config/bundles.php
@@ -9,4 +9,10 @@ return [
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
Flasher\Symfony\FlasherSymfonyBundle::class => ['all' => true],
Flasher\Noty\Symfony\FlasherNotySymfonyBundle::class => ['all' => true],
+ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
+ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
+ Symfony\UX\StimulusBundle\StimulusBundle::class => ['all' => true],
+ Symfony\UX\Turbo\TurboBundle::class => ['all' => true],
+ Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true],
+ Symfony\UX\Icons\UXIconsBundle::class => ['all' => true],
];
diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml
new file mode 100644
index 0000000..25138b9
--- /dev/null
+++ b/config/packages/doctrine.yaml
@@ -0,0 +1,54 @@
+doctrine:
+ dbal:
+ url: '%env(resolve:DATABASE_URL)%'
+
+ # IMPORTANT: You MUST configure your server version,
+ # either here or in the DATABASE_URL env var (see .env file)
+ #server_version: '16'
+
+ profiling_collect_backtrace: '%kernel.debug%'
+ use_savepoints: true
+ orm:
+ auto_generate_proxy_classes: true
+ enable_lazy_ghost_objects: true
+ report_fields_where_declared: true
+ validate_xml_mapping: true
+ naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
+ identity_generation_preferences:
+ Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity
+ auto_mapping: true
+ mappings:
+ App:
+ type: attribute
+ is_bundle: false
+ dir: '%kernel.project_dir%/src/Entity'
+ prefix: 'App\Entity'
+ alias: App
+ controller_resolver:
+ auto_mapping: false
+
+when@test:
+ doctrine:
+ dbal:
+ # "TEST_TOKEN" is typically set by ParaTest
+ dbname_suffix: '_test%env(default::TEST_TOKEN)%'
+
+when@prod:
+ doctrine:
+ orm:
+ auto_generate_proxy_classes: false
+ proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies'
+ query_cache_driver:
+ type: pool
+ pool: doctrine.system_cache_pool
+ result_cache_driver:
+ type: pool
+ pool: doctrine.result_cache_pool
+
+ framework:
+ cache:
+ pools:
+ doctrine.result_cache_pool:
+ adapter: cache.app
+ doctrine.system_cache_pool:
+ adapter: cache.system
diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml
new file mode 100644
index 0000000..29231d9
--- /dev/null
+++ b/config/packages/doctrine_migrations.yaml
@@ -0,0 +1,6 @@
+doctrine_migrations:
+ migrations_paths:
+ # namespace is arbitrary but should be different from App\Migrations
+ # as migrations classes should NOT be autoloaded
+ 'DoctrineMigrations': '%kernel.project_dir%/migrations'
+ enable_profiler: false
diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml
index 7e1ee1f..a269f69 100644
--- a/config/packages/framework.yaml
+++ b/config/packages/framework.yaml
@@ -3,7 +3,8 @@ framework:
secret: '%env(APP_SECRET)%'
# Note that the session will be started ONLY if you read or write from it.
- session: true
+ session:
+ cookie_samesite: 'lax'
#esi: true
#fragments: true
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/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/importmap.php b/importmap.php
index 70ebf14..7d49b8d 100644
--- a/importmap.php
+++ b/importmap.php
@@ -16,4 +16,16 @@ return [
'path' => './assets/app.js',
'entrypoint' => true,
],
+ '@hotwired/stimulus' => [
+ 'version' => '3.2.2',
+ ],
+ '@symfony/stimulus-bundle' => [
+ 'path' => './vendor/symfony/stimulus-bundle/assets/dist/loader.js',
+ ],
+ '@hotwired/turbo' => [
+ 'version' => '7.3.0',
+ ],
+ '@stripe/stripe-js' => [
+ 'version' => '5.6.0',
+ ],
];
diff --git a/migrations/.gitignore b/migrations/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/src/Controller/TicketController.php b/src/Controller/TicketController.php
new file mode 100644
index 0000000..0a30335
--- /dev/null
+++ b/src/Controller/TicketController.php
@@ -0,0 +1,63 @@
+render('ticket/index.html.twig');
+ }
+
+ #[Route(path: '/ticket/submit', name: 'app_submit', methods: Request::METHOD_POST)]
+ public function submit(Request $request): Response
+ {
+ $ticketData = $this->serializer->deserialize($request->getContent(), TicketFormData::class, 'json');
+
+ return $this->json(['id' => $this->service->handleTicketData($ticketData)->id]);
+ }
+
+ #[Route(path: '/success', name: 'app_success', methods: Request::METHOD_GET)]
+ public function success(Request $request): Response
+ {
+ $sessionId = $request->query->get('session_id');
+
+ if (!$sessionId) {
+ noty()->error('Etwas ist schiefgelaufen');
+
+ return $this->redirectToRoute('app_ticket');
+ }
+
+ if (!$this->service->completePayment($sessionId)) {
+ noty()->error('Etwas ist schiefgelaufen');
+
+ return $this->redirectToRoute('app_ticket');
+ }
+
+ return $this->render('ticket/success.html.twig');
+ }
+
+ #[Route(path: '/cancelled', name: 'app_cancelled', methods: Request::METHOD_GET)]
+ public function cancel(): Response
+ {
+ noty()->error('Bezahlung abgebrochen');
+
+ return $this->redirectToRoute('app_ticket');
+ }
+}
diff --git a/src/DataObjects/PersonalData.php b/src/DataObjects/PersonalData.php
new file mode 100644
index 0000000..f201c80
--- /dev/null
+++ b/src/DataObjects/PersonalData.php
@@ -0,0 +1,14 @@
+
+ */
+ #[ORM\OneToMany(targetEntity: Ticket::class, mappedBy: 'customer', cascade: ['persist'], fetch: 'EAGER', orphanRemoval: true)]
+ private Collection $tickets;
+
+ #[ORM\OneToOne(mappedBy: 'customer', cascade: ['persist', 'remove'])]
+ private ?Payment $payment = null;
+
+ public function __construct()
+ {
+ $this->tickets = new ArrayCollection();
+ }
+
+ public function getId(): ?int
+ {
+ return $this->id;
+ }
+
+ public function getEmail(): ?string
+ {
+ return $this->email;
+ }
+
+ public function setEmail(string $email): static
+ {
+ $this->email = $email;
+
+ return $this;
+ }
+
+ public function getPhone(): ?string
+ {
+ return $this->phone;
+ }
+
+ public function setPhone(?string $phone): static
+ {
+ $this->phone = $phone;
+
+ return $this;
+ }
+
+ public function getFirstname(): ?string
+ {
+ return $this->firstname;
+ }
+
+ public function setFirstname(string $firstname): static
+ {
+ $this->firstname = $firstname;
+
+ return $this;
+ }
+
+ public function getLastname(): ?string
+ {
+ return $this->lastname;
+ }
+
+ public function setLastname(string $lastname): static
+ {
+ $this->lastname = $lastname;
+
+ return $this;
+ }
+
+ /**
+ * @return Collection
+ */
+ public function getTickets(): Collection
+ {
+ return $this->tickets;
+ }
+
+ public function addTicket(Ticket $ticket): static
+ {
+ if (!$this->tickets->contains($ticket)) {
+ $this->tickets->add($ticket);
+ $ticket->setCustomer($this);
+ }
+
+ return $this;
+ }
+
+ public function removeTicket(Ticket $ticket): static
+ {
+ if ($this->tickets->removeElement($ticket)) {
+ // set the owning side to null (unless already changed)
+ if ($ticket->getCustomer() === $this) {
+ $ticket->setCustomer(null);
+ }
+ }
+
+ return $this;
+ }
+
+ public function addTickets(array $tickets): static
+ {
+ foreach ($tickets as $ticket) {
+ $this->addTicket($ticket);
+ }
+
+ return $this;
+ }
+
+ public function getPayment(): ?Payment
+ {
+ return $this->payment;
+ }
+
+ public function setPayment(Payment $payment): static
+ {
+ // set the owning side of the relation if necessary
+ if ($payment->getCustomer() !== $this) {
+ $payment->setCustomer($this);
+ }
+
+ $this->payment = $payment;
+
+ return $this;
+ }
+}
diff --git a/src/Entity/Payment.php b/src/Entity/Payment.php
new file mode 100644
index 0000000..0e788af
--- /dev/null
+++ b/src/Entity/Payment.php
@@ -0,0 +1,66 @@
+id;
+ }
+
+ public function getSessionId(): ?string
+ {
+ return $this->sessionId;
+ }
+
+ public function setSessionId(string $sessionId): static
+ {
+ $this->sessionId = $sessionId;
+
+ return $this;
+ }
+
+ public function isCompleted(): ?bool
+ {
+ return $this->completed;
+ }
+
+ public function setCompleted(bool $completed): static
+ {
+ $this->completed = $completed;
+
+ return $this;
+ }
+
+ public function getCustomer(): ?Customer
+ {
+ return $this->customer;
+ }
+
+ public function setCustomer(Customer $customer): static
+ {
+ $this->customer = $customer;
+
+ return $this;
+ }
+}
diff --git a/src/Entity/Ticket.php b/src/Entity/Ticket.php
new file mode 100644
index 0000000..1bb91de
--- /dev/null
+++ b/src/Entity/Ticket.php
@@ -0,0 +1,81 @@
+id;
+ }
+
+ public function getType(): ?int
+ {
+ return $this->type;
+ }
+
+ public function setType(int $type): static
+ {
+ $this->type = $type;
+
+ return $this;
+ }
+
+ public function getFoodType(): ?int
+ {
+ return $this->foodType;
+ }
+
+ public function setFoodType(int $foodType): static
+ {
+ $this->foodType = $foodType;
+
+ return $this;
+ }
+
+ public function getNote(): ?string
+ {
+ return $this->note;
+ }
+
+ public function setNote(?string $note): static
+ {
+ $this->note = $note;
+
+ return $this;
+ }
+
+ public function getCustomer(): ?Customer
+ {
+ return $this->customer;
+ }
+
+ public function setCustomer(?Customer $customer): static
+ {
+ $this->customer = $customer;
+
+ return $this;
+ }
+}
diff --git a/src/Enum/TicketData.php b/src/Enum/TicketData.php
new file mode 100644
index 0000000..3e7eb04
--- /dev/null
+++ b/src/Enum/TicketData.php
@@ -0,0 +1,25 @@
+ [
+ 'name' => 'Ticket',
+ 'price' => 50,
+ ],
+ 2 => [
+ 'name' => 'After-Show Ticket',
+ 'price' => 20,
+ ],
+ 3 => [
+ 'name' => 'Kind (6-12 Jahre)',
+ 'price' => 0,
+ ],
+ 4 => [
+ 'name' => 'Kind (0-6 Jahre)',
+ 'price' => 0,
+ ],
+ ];
+}
\ No newline at end of file
diff --git a/src/Repository/.gitignore b/src/Repository/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/src/Repository/CustomerRepository.php b/src/Repository/CustomerRepository.php
new file mode 100644
index 0000000..49fe06a
--- /dev/null
+++ b/src/Repository/CustomerRepository.php
@@ -0,0 +1,18 @@
+
+ */
+class CustomerRepository extends ServiceEntityRepository
+{
+ public function __construct(ManagerRegistry $registry)
+ {
+ parent::__construct($registry, Customer::class);
+ }
+}
diff --git a/src/Repository/PaymentRepository.php b/src/Repository/PaymentRepository.php
new file mode 100644
index 0000000..bf97e4b
--- /dev/null
+++ b/src/Repository/PaymentRepository.php
@@ -0,0 +1,18 @@
+
+ */
+class PaymentRepository extends ServiceEntityRepository
+{
+ public function __construct(ManagerRegistry $registry)
+ {
+ parent::__construct($registry, Payment::class);
+ }
+}
diff --git a/src/Repository/TicketRepository.php b/src/Repository/TicketRepository.php
new file mode 100644
index 0000000..fce3bff
--- /dev/null
+++ b/src/Repository/TicketRepository.php
@@ -0,0 +1,18 @@
+
+ */
+class TicketRepository extends ServiceEntityRepository
+{
+ public function __construct(ManagerRegistry $registry)
+ {
+ parent::__construct($registry, Ticket::class);
+ }
+}
diff --git a/src/Service/TicketService.php b/src/Service/TicketService.php
new file mode 100644
index 0000000..3570e73
--- /dev/null
+++ b/src/Service/TicketService.php
@@ -0,0 +1,129 @@
+createSession($this->getLineItems($data->tickets), $data->personal->email);
+
+ $this->saveTicketData($data, $session->id);
+
+ return $session;
+ }
+
+ public function saveTicketData(TicketFormData $data, string $sessionId): void
+ {
+ $payment = (new Payment())
+ ->setSessionId($sessionId)
+ ->setCompleted(false)
+ ->setCustomer($this->createEntityFromData($data));
+
+ $this->em->persist($payment);
+ $this->em->flush();
+ }
+
+
+ public function completePayment(string $sessionId): bool
+ {
+ if (!$payment = $this->paymentRepository->findOneBy(['sessionId' => $sessionId])) {
+ return false;
+ }
+
+ $payment->setCompleted(true);
+ $this->em->flush();
+
+ return true;
+ }
+
+ private function getLineItems(array $tickets): array
+ {
+ $lineItems = [];
+
+ foreach ($tickets as $ticket) {
+ $ticketData = TicketEnum::TICKET_DATA[$ticket->ticketType];
+ $lineItems[] = [
+ 'price_data' => [
+ 'currency' => 'eur',
+ 'product_data' => [
+ 'name' => $ticketData['name'],
+ ],
+ 'unit_amount' => $ticketData['price'] * 100,
+ ],
+ 'quantity' => 1,
+ ];
+ }
+
+ return $lineItems;
+ }
+
+ private function createSession(array $lineItems, string $email): Session
+ {
+ return Session::create([
+ 'line_items' => $lineItems,
+ 'mode' => 'payment',
+ 'customer_email' => $email,
+ 'success_url' => $this->generator->generate('app_success', [], 0) . '?session_id={CHECKOUT_SESSION_ID}',
+ 'cancel_url' => $this->generator->generate('app_cancelled', [], 0),
+ ]);
+ }
+
+ private function createEntityFromData(TicketFormData $ticketData): Customer
+ {
+ $personalData = $ticketData->personal;
+
+ $entity = (new Customer())
+ ->setFirstname($personalData->firstname)
+ ->setLastname($personalData->lastname)
+ ->setEmail($personalData->email)
+ ->setPhone($personalData->phone);
+
+ $entity->addTickets($this->createTicketEntities($ticketData->tickets));
+
+ $this->em->persist($entity);
+ $this->em->flush();
+
+ return $entity;
+ }
+
+ /**
+ * @param TicketData[] $tickets
+ */
+ private function createTicketEntities(array $tickets): array
+ {
+ $entities = [];
+
+ foreach ($tickets as $ticket) {
+ $entities[] = (new Ticket())
+ ->setType($ticket->ticketType)
+ ->setFoodType($ticket->foodType)
+ ->setNote($ticket->note);
+ }
+
+ return $entities;
+ }
+}
\ No newline at end of file
diff --git a/src/Twig/Environment.php b/src/Twig/Environment.php
new file mode 100644
index 0000000..8f363be
--- /dev/null
+++ b/src/Twig/Environment.php
@@ -0,0 +1,19 @@
+getVar(...))];
+ }
+
+ public function getVar(string $name): string
+ {
+ return $_ENV[$name];
+ }
+}
\ No newline at end of file
diff --git a/symfony.lock b/symfony.lock
index 3c17d2a..8377651 100644
--- a/symfony.lock
+++ b/symfony.lock
@@ -1,4 +1,40 @@
{
+ "doctrine/annotations": {
+ "version": "2.0",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "1.10",
+ "ref": "64d8583af5ea57b7afa4aba4b159907f3a148b05"
+ }
+ },
+ "doctrine/doctrine-bundle": {
+ "version": "2.13",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "2.13",
+ "ref": "8d96c0b51591ffc26794d865ba3ee7d193438a83"
+ },
+ "files": [
+ "config/packages/doctrine.yaml",
+ "src/Entity/.gitignore",
+ "src/Repository/.gitignore"
+ ]
+ },
+ "doctrine/doctrine-migrations-bundle": {
+ "version": "3.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "3.1",
+ "ref": "1d01ec03c6ecbd67c3375c5478c9a423ae5d6a33"
+ },
+ "files": [
+ "config/packages/doctrine_migrations.yaml",
+ "migrations/.gitignore"
+ ]
+ },
"php-flasher/flasher-noty-symfony": {
"version": "v2.1.2"
},
@@ -110,6 +146,21 @@
"config/routes.yaml"
]
},
+ "symfony/stimulus-bundle": {
+ "version": "2.22",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "2.20",
+ "ref": "3acc494b566816514a6873a89023a35440b6386d"
+ },
+ "files": [
+ "assets/bootstrap.js",
+ "assets/controllers.json",
+ "assets/controllers/csrf_protection_controller.js",
+ "assets/controllers/hello_controller.js"
+ ]
+ },
"symfony/twig-bundle": {
"version": "7.2",
"recipe": {
@@ -123,6 +174,51 @@
"templates/base.html.twig"
]
},
+ "symfony/ux-icons": {
+ "version": "2.22",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "2.17",
+ "ref": "803a3bbd5893f9584969ab8670290cdfb6a0a5b5"
+ },
+ "files": [
+ "assets/icons/symfony.svg"
+ ]
+ },
+ "symfony/ux-turbo": {
+ "version": "2.22",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "2.20",
+ "ref": "c85ff94da66841d7ff087c19cbcd97a2df744ef9"
+ }
+ },
+ "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": {
diff --git a/templates/base.html.twig b/templates/base.html.twig
index 156a6ae..663a2e0 100644
--- a/templates/base.html.twig
+++ b/templates/base.html.twig
@@ -13,7 +13,7 @@
{% block importmap %}{{ importmap('app') }}{% endblock %}
{% endblock %}
-
+
{% block body %}{% endblock %}
diff --git a/templates/home/index.html.twig b/templates/home/index.html.twig
index ba6c817..1de0647 100644
--- a/templates/home/index.html.twig
+++ b/templates/home/index.html.twig
@@ -26,7 +26,7 @@
diff --git a/templates/ticket/_partials/_form.html.twig b/templates/ticket/_partials/_form.html.twig
new file mode 100644
index 0000000..7efd613
--- /dev/null
+++ b/templates/ticket/_partials/_form.html.twig
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/ticket/index.html.twig b/templates/ticket/index.html.twig
new file mode 100644
index 0000000..04e52dc
--- /dev/null
+++ b/templates/ticket/index.html.twig
@@ -0,0 +1,92 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}Tickets kaufen{% endblock %}
+
+{% block body %}
+
+
+
+
+
+
+ Tickets kaufen
+
+
+
+
+
+
+{% endblock %}
diff --git a/templates/ticket/success.html.twig b/templates/ticket/success.html.twig
new file mode 100644
index 0000000..eb38a9a
--- /dev/null
+++ b/templates/ticket/success.html.twig
@@ -0,0 +1,16 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}
+Success
+{% endblock %}
+
+{% block body %}
+
+
+
+
Success
+
Your ticket has been successfully created.
+
+
+
+{% endblock %}