From c06293cbf91ad1d8d8c12e2dd3b875a4554df227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Poirier=20Th=C3=A9or=C3=AAt?= Date: Fri, 19 Apr 2024 15:14:29 -0400 Subject: [PATCH] [SonataImportBundle] Support for translation --- app/migrations/Version20240419194259.php | 50 + app/src/DataFixtures/AppFixtures.php | 26 +- app/src/Entity/Tag.php | 44 +- app/src/Entity/TagTranslation.php | 55 + app/src/Sonata/Admin/TagAdmin.php | 4 + composer.json | 6 +- composer.lock | 1120 +++++++++-------- config/bundles.php | 3 +- config/packages/draw_sonata_import.yaml | 3 + .../Admin/ColumnAdmin.php | 43 +- .../Admin/ImportAdmin.php | 8 +- .../ColumnBuilder/ColumnBuilderInterface.php | 2 +- .../Column/ColumnBuilder/ColumnInfo.php | 7 + .../DoctrineAssociationColumnBuilder.php | 3 +- .../DoctrineAssociationFieldColumnBuilder.php | 3 +- .../DoctrineAssociationPathColumnBuilder.php | 3 +- .../Doctrine/DoctrineFieldColumnBuilder.php | 4 +- .../MappedToOptionColumnBuilder.php | 34 + .../NamedBaseIdentifierColumnBuilder.php | 2 +- .../ColumnBuilder/ReflectionColumnBuilder.php | 4 +- .../Column/ColumnFactory.php | 15 +- .../DoctrineMappedToOptionBuilder.php | 14 +- ...ctrineTranslationMappedToOptionBuilder.php | 86 ++ .../MappedToOptionBuilderInterface.php | 2 +- .../MappedToOptionBuilderAggregator.php | 33 + .../DependencyInjection/Configuration.php | 26 + .../DrawSonataImportExtension.php | 16 + .../sonata-import-bundle/Entity/Column.php | 1 - .../Tests/ColumnFactoryTest.php | 22 +- symfony.lock | 15 +- 30 files changed, 1076 insertions(+), 578 deletions(-) create mode 100644 app/migrations/Version20240419194259.php create mode 100644 app/src/Entity/TagTranslation.php create mode 100644 packages/sonata-import-bundle/Column/ColumnBuilder/ColumnInfo.php create mode 100644 packages/sonata-import-bundle/Column/ColumnBuilder/MappedToOptionColumnBuilder.php create mode 100644 packages/sonata-import-bundle/Column/MappedToOptionBuilder/DoctrineTranslationMappedToOptionBuilder.php create mode 100644 packages/sonata-import-bundle/Column/MappedToOptionBuilderAggregator.php diff --git a/app/migrations/Version20240419194259.php b/app/migrations/Version20240419194259.php new file mode 100644 index 000000000..7d0b53ea0 --- /dev/null +++ b/app/migrations/Version20240419194259.php @@ -0,0 +1,50 @@ +addSql('CREATE TABLE tag_translation ( + id INT AUTO_INCREMENT NOT NULL, + translatable_id BIGINT DEFAULT NULL, + label VARCHAR(255) NOT NULL, + locale VARCHAR(5) NOT NULL, + INDEX IDX_A8A03F8F2C2AC5D3 (translatable_id), + UNIQUE INDEX tag_translation_unique_translation (translatable_id, locale), + PRIMARY KEY(id) + ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('ALTER TABLE + tag_translation + ADD + CONSTRAINT FK_A8A03F8F2C2AC5D3 FOREIGN KEY (translatable_id) REFERENCES draw_acme__tag (id) ON DELETE CASCADE'); + $this->addSql('DROP INDEX UNIQ_C052A2E4EA750E8 ON draw_acme__tag'); + $this->addSql('ALTER TABLE draw_acme__tag CHANGE label name VARCHAR(255) NOT NULL'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_C052A2E45E237E06 ON draw_acme__tag (name)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE tag_translation DROP FOREIGN KEY FK_A8A03F8F2C2AC5D3'); + $this->addSql('DROP TABLE tag_translation'); + $this->addSql('DROP INDEX UNIQ_C052A2E45E237E06 ON draw_acme__tag'); + $this->addSql('ALTER TABLE draw_acme__tag CHANGE name label VARCHAR(255) NOT NULL'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_C052A2E4EA750E8 ON draw_acme__tag (label)'); + } +} diff --git a/app/src/DataFixtures/AppFixtures.php b/app/src/DataFixtures/AppFixtures.php index a97922ef8..276f0bc34 100644 --- a/app/src/DataFixtures/AppFixtures.php +++ b/app/src/DataFixtures/AppFixtures.php @@ -46,14 +46,32 @@ public function load(ObjectManager $manager): void private function loadTags(): iterable { yield 'admin' => (new Tag()) - ->setLabel('Admin'); + ->setName('admin') + ->translate('en') + ->setLabel('Admin') + ->getTranslatable() + ->translate('fr') + ->setLabel('Administrateur') + ->getTranslatable(); yield 'inactive' => (new Tag()) - ->setLabel('Inactive') - ->setActive(false); + ->setName('inactive') + ->setActive(false) + ->translate('en') + ->setLabel('Inactive') + ->getTranslatable() + ->translate('fr') + ->setLabel('Inactif') + ->getTranslatable(); yield 'not-use' => (new Tag()) - ->setLabel('NotUse'); + ->setName('not-use') + ->translate('en') + ->setLabel('NotUse') + ->getTranslatable() + ->translate('fr') + ->setLabel('Non Utilisé') + ->getTranslatable(); } private function loadUsers(): iterable diff --git a/app/src/Entity/Tag.php b/app/src/Entity/Tag.php index e0a4808ae..a06bcefd8 100644 --- a/app/src/Entity/Tag.php +++ b/app/src/Entity/Tag.php @@ -5,14 +5,17 @@ use Doctrine\ORM\Mapping as ORM; use Draw\Bundle\SonataExtraBundle\PreventDelete\PreventDelete; use JMS\Serializer\Annotation as Serializer; +use Knp\DoctrineBehaviors\Contract\Entity\TranslatableInterface; +use Knp\DoctrineBehaviors\Model\Translatable\TranslatableTrait; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Validator\Constraints as Assert; #[ ORM\Entity(repositoryClass: 'App\Repository\TagRepository'), ORM\Table(name: 'draw_acme__tag'), + ORM\HasLifecycleCallbacks ] -#[UniqueEntity(fields: ['label'])] +#[UniqueEntity(fields: ['name'])] #[PreventDelete( relatedClass: User::class, path: 'userTags.tag', @@ -21,8 +24,9 @@ 'path_label' => 'User tags', ] )] -class Tag implements \Stringable +class Tag implements \Stringable, TranslatableInterface { + use TranslatableTrait; #[ ORM\Id, ORM\GeneratedValue, @@ -30,15 +34,15 @@ class Tag implements \Stringable ] private ?int $id = null; - #[ORM\Column(name: 'active', type: 'boolean', options: ['default' => 1])] - private bool $active = true; - - #[ORM\Column(name: 'label', type: 'string', length: 255, unique: true, nullable: false)] + #[ORM\Column(unique: true)] #[ Assert\NotNull, Assert\Length(min: 3, max: 255) ] - private ?string $label = null; + private ?string $name = null; + + #[ORM\Column(name: 'active', type: 'boolean', options: ['default' => 1])] + private bool $active = true; public function getId(): ?int { @@ -52,14 +56,14 @@ public function setId(int $id): self return $this; } - public function getLabel(): ?string + public function getName(): ?string { - return $this->label; + return $this->name; } - public function setLabel(string $label): static + public function setName(?string $name): static { - $this->label = $label; + $this->name = $name; return $this; } @@ -76,6 +80,18 @@ public function setActive(bool $active): static return $this; } + public function getLabel(): ?string + { + return $this->translate(fallbackToDefault: false)->getLabel(); + } + + public function setLabel(?string $label): static + { + $this->translate(fallbackToDefault: false)->setLabel($label); + + return $this; + } + #[ Serializer\VirtualProperty, Serializer\SerializedName('virtualProperty') @@ -97,6 +113,12 @@ public function getVirtualPropertyArray(): array return [1]; } + #[ORM\PreFlush] + public function preFlush(): void + { + $this->mergeNewTranslations(); + } + public function __toString(): string { return (string) $this->getLabel(); diff --git a/app/src/Entity/TagTranslation.php b/app/src/Entity/TagTranslation.php new file mode 100644 index 000000000..95fbb9bda --- /dev/null +++ b/app/src/Entity/TagTranslation.php @@ -0,0 +1,55 @@ +id; + } + + public function setId(?int $id): static + { + $this->id = $id; + + return $this; + } + + public function getLabel(): ?string + { + return $this->label; + } + + public function setLabel(?string $label): self + { + $this->label = $label; + + return $this; + } +} diff --git a/app/src/Sonata/Admin/TagAdmin.php b/app/src/Sonata/Admin/TagAdmin.php index a3cb75079..0a196cf86 100644 --- a/app/src/Sonata/Admin/TagAdmin.php +++ b/app/src/Sonata/Admin/TagAdmin.php @@ -24,6 +24,7 @@ protected function configureListFields(ListMapper $list): void { $list ->addIdentifier('id') + ->add('name') ->add('label') ->add('active'); } @@ -32,6 +33,7 @@ protected function configureShowFields(ShowMapper $show): void { $show ->add('id') + ->add('name') ->add('label') ->add('active'); } @@ -39,6 +41,7 @@ protected function configureShowFields(ShowMapper $show): void protected function configureFormFields(FormMapper $form): void { $form + ->add('name') ->add('label') ->add('active'); } @@ -49,6 +52,7 @@ public function configureGridFields(array $fields): array $fields, [ 'id' => [], + 'name' => [], 'label' => [], 'active' => [], 'actions' => [ diff --git a/composer.json b/composer.json index fc536a6ff..301bc5be8 100644 --- a/composer.json +++ b/composer.json @@ -61,7 +61,8 @@ "friendsofphp/php-cs-fixer": "^3.13", "nesbot/carbon": "^2.0", "doctrine/mongodb-odm-bundle": "*", - "fidry/cpu-core-counter": "^1.1" + "fidry/cpu-core-counter": "^1.1", + "knplabs/doctrine-behaviors": "*" }, "require-dev": { "ext-pcntl": "*", @@ -120,7 +121,8 @@ "scheb/2fa-email": "^6.0", "colinodell/psr-testlogger": "^1.1", "cweagans/composer-patches": "^1.7", - "symfony/notifier": "^6.4.0" + "symfony/notifier": "^6.4.0", + "symfony/maker-bundle": "^1.58" }, "replace": { "draw/application": "self.version", diff --git a/composer.lock b/composer.lock index 13a49981c..9cb691d5d 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": "17076ca60f35700e71304311facbb28c", + "content-hash": "f27d61a8609e8d6d0545bba8aeddcc89", "packages": [ { "name": "aws/aws-crt-php", @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.300.11", + "version": "3.305.0", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "b1c05a5d3cb429aa5d9ffa69066ce46e3d7aca52" + "reference": "6992342acf7dd4501163c6cddabe76c74f2020ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b1c05a5d3cb429aa5d9ffa69066ce46e3d7aca52", - "reference": "b1c05a5d3cb429aa5d9ffa69066ce46e3d7aca52", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6992342acf7dd4501163c6cddabe76c74f2020ad", + "reference": "6992342acf7dd4501163c6cddabe76c74f2020ad", "shasum": "" }, "require": { @@ -151,9 +151,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.300.11" + "source": "https://github.com/aws/aws-sdk-php/tree/3.305.0" }, - "time": "2024-03-05T19:08:14+00:00" + "time": "2024-04-22T18:07:07+00:00" }, { "name": "brick/math", @@ -281,16 +281,16 @@ }, { "name": "composer/pcre", - "version": "3.1.1", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", + "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", "shasum": "" }, "require": { @@ -332,7 +332,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.1" + "source": "https://github.com/composer/pcre/tree/3.1.3" }, "funding": [ { @@ -348,7 +348,7 @@ "type": "tidelift" } ], - "time": "2023-10-11T07:11:09+00:00" + "time": "2024-03-19T10:26:25+00:00" }, { "name": "composer/semver", @@ -433,16 +433,16 @@ }, { "name": "composer/xdebug-handler", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" + "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255", + "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255", "shasum": "" }, "require": { @@ -453,7 +453,7 @@ "require-dev": { "phpstan/phpstan": "^1.0", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", "autoload": { @@ -477,9 +477,9 @@ "performance" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.4" }, "funding": [ { @@ -495,83 +495,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T21:32:43+00:00" - }, - { - "name": "doctrine/annotations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "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.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "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.1" - }, - "time": "2023-02-02T22:02:53+00:00" + "time": "2024-03-26T18:29:49+00:00" }, { "name": "doctrine/cache", @@ -668,16 +592,16 @@ }, { "name": "doctrine/collections", - "version": "2.2.1", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "420480fc085bc65f3c956af13abe8e7546f94813" + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/420480fc085bc65f3c956af13abe8e7546f94813", - "reference": "420480fc085bc65f3c956af13abe8e7546f94813", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", "shasum": "" }, "require": { @@ -734,7 +658,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.2.1" + "source": "https://github.com/doctrine/collections/tree/2.2.2" }, "funding": [ { @@ -750,20 +674,20 @@ "type": "tidelift" } ], - "time": "2024-03-05T22:28:45+00:00" + "time": "2024-04-18T06:56:21+00:00" }, { "name": "doctrine/common", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" + "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", - "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", + "url": "https://api.github.com/repos/doctrine/common/zipball/0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a", + "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a", "shasum": "" }, "require": { @@ -825,7 +749,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.4.3" + "source": "https://github.com/doctrine/common/tree/3.4.4" }, "funding": [ { @@ -841,7 +765,7 @@ "type": "tidelift" } ], - "time": "2022-10-09T11:47:59+00:00" + "time": "2024-04-16T13:35:33+00:00" }, { "name": "doctrine/data-fixtures", @@ -1089,16 +1013,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.11.3", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "492725310ae9a1b5b20d6ae09fb5ae6404616e68" + "reference": "5418e811a14724068e95e0ba43353b903ada530f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/492725310ae9a1b5b20d6ae09fb5ae6404616e68", - "reference": "492725310ae9a1b5b20d6ae09fb5ae6404616e68", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5418e811a14724068e95e0ba43353b903ada530f", + "reference": "5418e811a14724068e95e0ba43353b903ada530f", "shasum": "" }, "require": { @@ -1136,6 +1060,7 @@ "symfony/property-info": "^5.4 || ^6.0 || ^7.0", "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.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", @@ -1153,7 +1078,7 @@ "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "" + "Doctrine\\Bundle\\DoctrineBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1188,7 +1113,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.11.3" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.12.0" }, "funding": [ { @@ -1204,7 +1129,7 @@ "type": "tidelift" } ], - "time": "2024-02-10T20:56:20+00:00" + "time": "2024-03-19T07:20:37+00:00" }, { "name": "doctrine/event-manager", @@ -1537,25 +1462,24 @@ }, { "name": "doctrine/mongodb-odm", - "version": "2.6.3", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/doctrine/mongodb-odm.git", - "reference": "58c2b1f49aa2b03405fc98343f62f044838f1ef2" + "reference": "8c7fa3f31c0018571f9c841b9212811df44ded96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/mongodb-odm/zipball/58c2b1f49aa2b03405fc98343f62f044838f1ef2", - "reference": "58c2b1f49aa2b03405fc98343f62f044838f1ef2", + "url": "https://api.github.com/repos/doctrine/mongodb-odm/zipball/8c7fa3f31c0018571f9c841b9212811df44ded96", + "reference": "8c7fa3f31c0018571f9c841b9212811df44ded96", "shasum": "" }, "require": { - "doctrine/annotations": "^1.12 || ^2.0", "doctrine/cache": "^1.11 || ^2.0", "doctrine/collections": "^1.5 || ^2.0", "doctrine/event-manager": "^1.0 || ^2.0", "doctrine/instantiator": "^1.1 || ^2", - "doctrine/persistence": "^2.4 || ^3.0", + "doctrine/persistence": "^3.2", "ext-mongodb": "^1.11", "friendsofphp/proxy-manager-lts": "^1.0", "jean85/pretty-package-versions": "^1.3.0 || ^2.0.1", @@ -1566,7 +1490,11 @@ "symfony/deprecation-contracts": "^2.2 || ^3.0", "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0" }, + "conflict": { + "doctrine/annotations": "<1.12 || >=3.0" + }, "require-dev": { + "doctrine/annotations": "^1.12 || ^2.0", "doctrine/coding-standard": "^12.0", "ext-bcmath": "*", "jmikola/geojson": "^1.0", @@ -1579,6 +1507,7 @@ "vimeo/psalm": "^5.9.0" }, "suggest": { + "doctrine/annotations": "For annotation mapping support", "ext-bcmath": "Decimal128 type support" }, "type": "library", @@ -1626,7 +1555,7 @@ ], "support": { "issues": "https://github.com/doctrine/mongodb-odm/issues", - "source": "https://github.com/doctrine/mongodb-odm/tree/2.6.3" + "source": "https://github.com/doctrine/mongodb-odm/tree/2.7.0" }, "funding": [ { @@ -1642,7 +1571,7 @@ "type": "tidelift" } ], - "time": "2024-02-28T22:36:13+00:00" + "time": "2024-03-06T14:24:19+00:00" }, { "name": "doctrine/mongodb-odm-bundle", @@ -1732,16 +1661,16 @@ }, { "name": "doctrine/orm", - "version": "2.19.0", + "version": "2.19.4", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "a809a71aa6a233a6c82e68ebaaf8954adc4998dc" + "reference": "b27489348658cd718d18005de37b94f7f8561467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/a809a71aa6a233a6c82e68ebaaf8954adc4998dc", - "reference": "a809a71aa6a233a6c82e68ebaaf8954adc4998dc", + "url": "https://api.github.com/repos/doctrine/orm/zipball/b27489348658cd718d18005de37b94f7f8561467", + "reference": "b27489348658cd718d18005de37b94f7f8561467", "shasum": "" }, "require": { @@ -1827,22 +1756,22 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.19.0" + "source": "https://github.com/doctrine/orm/tree/2.19.4" }, - "time": "2024-03-03T17:43:41+00:00" + "time": "2024-04-15T13:11:10+00:00" }, { "name": "doctrine/persistence", - "version": "3.3.1", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "b6fd1f126b13c1f7e7321f7338b14a19116b5de4" + "reference": "477da35bd0255e032826f440b94b3e37f2d56f42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/b6fd1f126b13c1f7e7321f7338b14a19116b5de4", - "reference": "b6fd1f126b13c1f7e7321f7338b14a19116b5de4", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/477da35bd0255e032826f440b94b3e37f2d56f42", + "reference": "477da35bd0255e032826f440b94b3e37f2d56f42", "shasum": "" }, "require": { @@ -1911,7 +1840,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.3.1" + "source": "https://github.com/doctrine/persistence/tree/3.3.2" }, "funding": [ { @@ -1927,7 +1856,7 @@ "type": "tidelift" } ], - "time": "2024-03-01T19:53:13+00:00" + "time": "2024-03-12T14:54:36+00:00" }, { "name": "doctrine/sql-formatter", @@ -2172,16 +2101,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.51.0", + "version": "v3.54.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "127fa74f010da99053e3f5b62672615b72dd6efd" + "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/127fa74f010da99053e3f5b62672615b72dd6efd", - "reference": "127fa74f010da99053e3f5b62672615b72dd6efd", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2aecbc8640d7906c38777b3dcab6f4ca79004d08", + "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08", "shasum": "" }, "require": { @@ -2205,6 +2134,7 @@ }, "require-dev": { "facile-it/paraunit": "^1.3 || ^2.0", + "infection/infection": "^0.27.11", "justinrainbow/json-schema": "^5.2", "keradus/cli-executor": "^2.1", "mikey179/vfsstream": "^1.6.11", @@ -2252,7 +2182,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.51.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.54.0" }, "funding": [ { @@ -2260,20 +2190,20 @@ "type": "github" } ], - "time": "2024-02-28T19:50:06+00:00" + "time": "2024-04-17T08:12:13+00:00" }, { "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.16", + "version": "v1.0.18", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c" + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c", - "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", "shasum": "" }, "require": { @@ -2330,7 +2260,7 @@ ], "support": { "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16" + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.18" }, "funding": [ { @@ -2342,7 +2272,7 @@ "type": "tidelift" } ], - "time": "2023-05-24T07:17:17+00:00" + "time": "2024-03-20T12:50:41+00:00" }, { "name": "guzzlehttp/guzzle", @@ -2671,16 +2601,16 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.0.5", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", "shasum": "" }, "require": { @@ -2688,9 +2618,9 @@ "php": "^7.1|^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", + "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^0.12.66", + "phpstan/phpstan": "^1.4", "phpunit/phpunit": "^7.5|^8.5|^9.4", "vimeo/psalm": "^4.3" }, @@ -2724,9 +2654,9 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" }, - "time": "2021-10-08T21:21:46+00:00" + "time": "2024-03-08T09:58:59+00:00" }, { "name": "jms/metadata", @@ -2977,22 +2907,114 @@ ], "time": "2023-12-12T15:33:15+00:00" }, + { + "name": "knplabs/doctrine-behaviors", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/DoctrineBehaviors.git", + "reference": "aa7c160caec5716d4b9e065e4ed4a90a1cef9c50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/DoctrineBehaviors/zipball/aa7c160caec5716d4b9e065e4ed4a90a1cef9c50", + "reference": "aa7c160caec5716d4b9e065e4ed4a90a1cef9c50", + "shasum": "" + }, + "require": { + "doctrine/common": "^3.3", + "doctrine/dbal": "^3.3", + "doctrine/doctrine-bundle": "^2.6", + "doctrine/orm": "^2.12", + "doctrine/persistence": "^2.5|^3.0", + "nette/utils": "^3.2", + "php": ">=8.0", + "ramsey/uuid": "^4.2", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/framework-bundle": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/security-core": "^5.4|^6.0", + "symfony/string": "^5.4|^6.0", + "symfony/translation-contracts": "^2.4|^3.0" + }, + "require-dev": { + "doctrine/annotations": "^1.13", + "ext-pdo_mysql": "*", + "ext-pdo_pgsql": "*", + "ext-pdo_sqlite": "*", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.7.10", + "phpstan/phpstan-doctrine": "^1.3", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "psr/log": "^1.1", + "rector/rector": "^0.13.4", + "symplify/easy-ci": "^10.2.9", + "symplify/easy-coding-standard": "^10.2.9", + "symplify/package-builder": "^10.2.9", + "symplify/phpstan-extensions": "^10.2.9", + "symplify/phpstan-rules": "^10.2.9" + }, + "type": "symfony-bundle", + "extra": { + "phpstan": { + "includes": [ + "phpstan-extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Knp\\DoctrineBehaviors\\": "src", + "Knp\\DoctrineBehaviors\\PHPStan\\": "utils/phpstan-behaviors/src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Knplabs", + "homepage": "http://knplabs.com" + } + ], + "description": "Doctrine Behavior Traits", + "homepage": "http://knplabs.com", + "keywords": [ + "Blameable", + "behaviors", + "doctrine", + "softdeletable", + "timestampable", + "translatable", + "tree", + "uuid" + ], + "support": { + "issues": "https://github.com/KnpLabs/DoctrineBehaviors/issues", + "source": "https://github.com/KnpLabs/DoctrineBehaviors/tree/2.6.2" + }, + "time": "2022-08-06T10:40:16+00:00" + }, { "name": "knplabs/knp-menu", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/KnpLabs/KnpMenu.git", - "reference": "bf7d89a7ef406fd2ec1aae6f30f722e844bf6d31" + "reference": "c39403f7c427d1b72cc56f38df0a075b4b9191fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/bf7d89a7ef406fd2ec1aae6f30f722e844bf6d31", - "reference": "bf7d89a7ef406fd2ec1aae6f30f722e844bf6d31", + "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/c39403f7c427d1b72cc56f38df0a075b4b9191fe", + "reference": "c39403f7c427d1b72cc56f38df0a075b4b9191fe", "shasum": "" }, "require": { - "php": "^8.0" + "php": "^8.1" }, "conflict": { "twig/twig": "<1.42.3 || >=2,<2.9" @@ -3000,11 +3022,11 @@ "require-dev": { "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.6", - "psr/container": "^1.0", - "symfony/http-foundation": "^5.4 || ^6.0", - "symfony/phpunit-bridge": "^6.2", - "symfony/routing": "^5.4 || ^6.0", - "twig/twig": "^2.9 || ^3.0" + "psr/container": "^1.0 || ^2.0", + "symfony/http-foundation": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^7.0", + "symfony/routing": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^2.16 || ^3.0" }, "suggest": { "twig/twig": "for the TwigRenderer and the integration with your templates" @@ -3046,32 +3068,32 @@ ], "support": { "issues": "https://github.com/KnpLabs/KnpMenu/issues", - "source": "https://github.com/KnpLabs/KnpMenu/tree/v3.4.0" + "source": "https://github.com/KnpLabs/KnpMenu/tree/v3.5.0" }, - "time": "2023-05-17T18:48:46+00:00" + "time": "2024-03-23T15:35:09+00:00" }, { "name": "knplabs/knp-menu-bundle", - "version": "v3.3.0", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/KnpLabs/KnpMenuBundle.git", - "reference": "02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5" + "reference": "925dd71fc9d7c31dd852a0537757be60c25e3afe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/KnpMenuBundle/zipball/02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5", - "reference": "02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5", + "url": "https://api.github.com/repos/KnpLabs/KnpMenuBundle/zipball/925dd71fc9d7c31dd852a0537757be60c25e3afe", + "reference": "925dd71fc9d7c31dd852a0537757be60c25e3afe", "shasum": "" }, "require": { "knplabs/knp-menu": "^3.3", - "php": "^8.0", + "php": "^8.1", "symfony/deprecation-contracts": "^2.5 | ^3.3", "symfony/framework-bundle": "^5.4 | ^6.0 | ^7.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 | ^10.1", + "phpunit/phpunit": "^10.5 | ^11.0.3", "symfony/expression-language": "^5.4 | ^6.0 | ^7.0", "symfony/phpunit-bridge": "^6.0 | ^7.0", "symfony/templating": "^5.4 | ^6.0 | ^7.0" @@ -3111,9 +3133,9 @@ ], "support": { "issues": "https://github.com/KnpLabs/KnpMenuBundle/issues", - "source": "https://github.com/KnpLabs/KnpMenuBundle/tree/v3.3.0" + "source": "https://github.com/KnpLabs/KnpMenuBundle/tree/v3.4.1" }, - "time": "2023-11-01T09:25:40+00:00" + "time": "2024-04-15T13:35:09+00:00" }, { "name": "laminas/laminas-code", @@ -3180,16 +3202,16 @@ }, { "name": "masterminds/html5", - "version": "2.8.1", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", "shasum": "" }, "require": { @@ -3197,7 +3219,7 @@ "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" }, "type": "library", "extra": { @@ -3241,29 +3263,29 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" }, - "time": "2023-05-10T11:58:31+00:00" + "time": "2024-03-31T07:05:07+00:00" }, { "name": "mongodb/mongodb", - "version": "1.17.0", + "version": "1.18.0", "source": { "type": "git", "url": "https://github.com/mongodb/mongo-php-library.git", - "reference": "9d9c917cf7ff275ed6bd63c596efeb6e49fd0e53" + "reference": "d421c418ef56a96f3dfa6b2828f936df6848ccf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/9d9c917cf7ff275ed6bd63c596efeb6e49fd0e53", - "reference": "9d9c917cf7ff275ed6bd63c596efeb6e49fd0e53", + "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/d421c418ef56a96f3dfa6b2828f936df6848ccf9", + "reference": "d421c418ef56a96f3dfa6b2828f936df6848ccf9", "shasum": "" }, "require": { + "composer-runtime-api": "^2.0", "ext-hash": "*", "ext-json": "*", - "ext-mongodb": "^1.17.0", - "jean85/pretty-package-versions": "^2.0.1", + "ext-mongodb": "^1.18.0", "php": "^7.4 || ^8.0", "psr/log": "^1.1.4|^2|^3", "symfony/polyfill-php80": "^1.27", @@ -3271,7 +3293,7 @@ }, "require-dev": { "doctrine/coding-standard": "^12.0", - "rector/rector": "^0.18", + "rector/rector": "^0.19", "squizlabs/php_codesniffer": "^3.7", "symfony/phpunit-bridge": "^5.2", "vimeo/psalm": "^5.13" @@ -3279,7 +3301,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17.x-dev" + "dev-master": "1.18.x-dev" } }, "autoload": { @@ -3318,9 +3340,9 @@ ], "support": { "issues": "https://github.com/mongodb/mongo-php-library/issues", - "source": "https://github.com/mongodb/mongo-php-library/tree/1.17.0" + "source": "https://github.com/mongodb/mongo-php-library/tree/1.18.0" }, - "time": "2023-11-15T09:21:50+00:00" + "time": "2024-03-27T17:04:50+00:00" }, { "name": "mtdowling/jmespath.php", @@ -3554,6 +3576,92 @@ ], "time": "2024-01-25T10:35:09+00:00" }, + { + "name": "nette/utils", + "version": "v3.2.10", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2", + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.4" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "~2.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v3.2.10" + }, + "time": "2023-07-30T15:38:18+00:00" + }, { "name": "nikic/php-parser", "version": "v5.0.2", @@ -3785,28 +3893,35 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", + "version": "5.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + "reference": "298d2febfe79d03fe714eb871d5538da55205b1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/298d2febfe79d03fe714eb871d5538da55205b1a", + "reference": "298d2febfe79d03fe714eb871d5538da55205b1a", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.1", "ext-filter": "*", - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7", "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" }, "type": "library", "extra": { @@ -3830,15 +3945,15 @@ }, { "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "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.3.0" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.0" }, - "time": "2021-10-19T17:43:47+00:00" + "time": "2024-04-09T21:13:58+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -3900,16 +4015,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.26.0", + "version": "1.28.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "231e3186624c03d7e7c890ec662b81e6b0405227" + "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227", - "reference": "231e3186624c03d7e7c890ec662b81e6b0405227", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb", + "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb", "shasum": "" }, "require": { @@ -3941,22 +4056,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.26.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.28.0" }, - "time": "2024-02-23T16:05:55+00:00" + "time": "2024-04-03T18:51:33+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.12", + "version": "10.1.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63" + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/842f72662d6b9edda84c4b6f13885fd9cd53dc63", - "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", "shasum": "" }, "require": { @@ -4013,7 +4128,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.12" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" }, "funding": [ { @@ -4021,7 +4136,7 @@ "type": "github" } ], - "time": "2024-03-02T07:22:05+00:00" + "time": "2024-03-12T15:33:41+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4268,16 +4383,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.11", + "version": "10.5.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4" + "reference": "c726f0de022368f6ed103e452a765d3304a996a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", - "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c726f0de022368f6ed103e452a765d3304a996a4", + "reference": "c726f0de022368f6ed103e452a765d3304a996a4", "shasum": "" }, "require": { @@ -4349,7 +4464,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.11" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.19" }, "funding": [ { @@ -4365,7 +4480,7 @@ "type": "tidelift" } ], - "time": "2024-02-25T14:05:00+00:00" + "time": "2024-04-17T14:06:18+00:00" }, { "name": "psr/cache", @@ -5374,16 +5489,16 @@ }, { "name": "sebastian/environment", - "version": "6.0.1", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { @@ -5398,7 +5513,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -5426,7 +5541,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { @@ -5434,7 +5549,7 @@ "type": "github" } ], - "time": "2023-04-11T05:39:26+00:00" + "time": "2024-03-23T08:47:14+00:00" }, { "name": "sebastian/exporter", @@ -5974,16 +6089,16 @@ }, { "name": "sonata-project/admin-bundle", - "version": "4.29.3", + "version": "4.30.1", "source": { "type": "git", "url": "https://github.com/sonata-project/SonataAdminBundle.git", - "reference": "9b1294e569d23a6d4c848af526362e0ec12e91d7" + "reference": "8fd565884ed2b3be6e6ec20cf65cb213de0c776c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sonata-project/SonataAdminBundle/zipball/9b1294e569d23a6d4c848af526362e0ec12e91d7", - "reference": "9b1294e569d23a6d4c848af526362e0ec12e91d7", + "url": "https://api.github.com/repos/sonata-project/SonataAdminBundle/zipball/8fd565884ed2b3be6e6ec20cf65cb213de0c776c", + "reference": "8fd565884ed2b3be6e6ec20cf65cb213de0c776c", "shasum": "" }, "require": { @@ -6087,7 +6202,7 @@ ], "support": { "issues": "https://github.com/sonata-project/SonataAdminBundle/issues", - "source": "https://github.com/sonata-project/SonataAdminBundle/tree/4.29.3" + "source": "https://github.com/sonata-project/SonataAdminBundle/tree/4.30.1" }, "funding": [ { @@ -6107,7 +6222,7 @@ "type": "github" } ], - "time": "2024-01-22T09:11:36+00:00" + "time": "2024-04-10T20:09:57+00:00" }, { "name": "sonata-project/block-bundle", @@ -6329,16 +6444,16 @@ }, { "name": "sonata-project/doctrine-orm-admin-bundle", - "version": "4.16.0", + "version": "4.17.0", "source": { "type": "git", "url": "https://github.com/sonata-project/SonataDoctrineORMAdminBundle.git", - "reference": "e7e5bfe115aac6e6913c06350f2b36f76836d3b7" + "reference": "0f2c98d9657e1a9a963327555fda70c45239b359" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sonata-project/SonataDoctrineORMAdminBundle/zipball/e7e5bfe115aac6e6913c06350f2b36f76836d3b7", - "reference": "e7e5bfe115aac6e6913c06350f2b36f76836d3b7", + "url": "https://api.github.com/repos/sonata-project/SonataDoctrineORMAdminBundle/zipball/0f2c98d9657e1a9a963327555fda70c45239b359", + "reference": "0f2c98d9657e1a9a963327555fda70c45239b359", "shasum": "" }, "require": { @@ -6438,7 +6553,7 @@ ], "support": { "issues": "https://github.com/sonata-project/SonataDoctrineORMAdminBundle/issues", - "source": "https://github.com/sonata-project/SonataDoctrineORMAdminBundle/tree/4.16.0" + "source": "https://github.com/sonata-project/SonataDoctrineORMAdminBundle/tree/4.17.0" }, "funding": [ { @@ -6458,7 +6573,7 @@ "type": "github" } ], - "time": "2024-02-26T11:46:18+00:00" + "time": "2024-04-13T19:17:35+00:00" }, { "name": "sonata-project/exporter", @@ -6989,16 +7104,16 @@ }, { "name": "symfony/cache", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "0ef36534694c572ff526d91c7181f3edede176e7" + "reference": "b59bbf9c093b592d77110f9ee70c74dff89294cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/0ef36534694c572ff526d91c7181f3edede176e7", - "reference": "0ef36534694c572ff526d91c7181f3edede176e7", + "url": "https://api.github.com/repos/symfony/cache/zipball/b59bbf9c093b592d77110f9ee70c74dff89294cb", + "reference": "b59bbf9c093b592d77110f9ee70c74dff89294cb", "shasum": "" }, "require": { @@ -7065,7 +7180,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.4" + "source": "https://github.com/symfony/cache/tree/v6.4.6" }, "funding": [ { @@ -7081,20 +7196,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-03-27T13:27:42+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.4.0", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778" + "reference": "2c9db6509a1b21dad229606897639d3284f54b2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/2c9db6509a1b21dad229606897639d3284f54b2a", + "reference": "2c9db6509a1b21dad229606897639d3284f54b2a", "shasum": "" }, "require": { @@ -7141,7 +7256,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.4.2" }, "funding": [ { @@ -7157,7 +7272,7 @@ "type": "tidelift" } ], - "time": "2023-09-25T12:52:38+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/clock", @@ -7235,16 +7350,16 @@ }, { "name": "symfony/config", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047" + "reference": "18ac9da3106222dde9fc9e09ec016e5de9d2658f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6ea4affc27f2086c9d16b92ab5429ce1e3c38047", - "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047", + "url": "https://api.github.com/repos/symfony/config/zipball/18ac9da3106222dde9fc9e09ec016e5de9d2658f", + "reference": "18ac9da3106222dde9fc9e09ec016e5de9d2658f", "shasum": "" }, "require": { @@ -7290,7 +7405,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.4" + "source": "https://github.com/symfony/config/tree/v6.4.6" }, "funding": [ { @@ -7306,20 +7421,20 @@ "type": "tidelift" } ], - "time": "2024-02-26T07:52:26+00:00" + "time": "2024-03-27T19:47:45+00:00" }, { "name": "symfony/console", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" + "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78", - "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", + "url": "https://api.github.com/repos/symfony/console/zipball/a2708a5da5c87d1d0d52937bdeac625df659e11f", + "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f", "shasum": "" }, "require": { @@ -7384,7 +7499,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.4" + "source": "https://github.com/symfony/console/tree/v6.4.6" }, "funding": [ { @@ -7400,7 +7515,7 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-03-29T19:07:53+00:00" }, { "name": "symfony/css-selector", @@ -7469,16 +7584,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "6236e5e843cb763e9d0f74245678b994afea5363" + "reference": "31417777509923b22de5c6fb6b3ffcdebde37cb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6236e5e843cb763e9d0f74245678b994afea5363", - "reference": "6236e5e843cb763e9d0f74245678b994afea5363", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/31417777509923b22de5c6fb6b3ffcdebde37cb5", + "reference": "31417777509923b22de5c6fb6b3ffcdebde37cb5", "shasum": "" }, "require": { @@ -7530,7 +7645,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.4" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.6" }, "funding": [ { @@ -7546,7 +7661,7 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-03-27T22:00:14+00:00" }, { "name": "symfony/deprecation-contracts", @@ -7617,16 +7732,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.4.5", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "fb868f29461c8a9ffc5c729ac03d08bf49e0139b" + "reference": "7bebe23117c24669f64c54f1c703a4ec4c0cecd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/fb868f29461c8a9ffc5c729ac03d08bf49e0139b", - "reference": "fb868f29461c8a9ffc5c729ac03d08bf49e0139b", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/7bebe23117c24669f64c54f1c703a4ec4c0cecd3", + "reference": "7bebe23117c24669f64c54f1c703a4ec4c0cecd3", "shasum": "" }, "require": { @@ -7644,7 +7759,7 @@ "doctrine/orm": "<2.15", "symfony/cache": "<5.4", "symfony/dependency-injection": "<6.2", - "symfony/form": "<5.4.21|>=6,<6.2.7", + "symfony/form": "<5.4.38|>=6,<6.4.6|>=7,<7.0.6", "symfony/http-foundation": "<6.3", "symfony/http-kernel": "<6.2", "symfony/lock": "<6.3", @@ -7665,7 +7780,7 @@ "symfony/dependency-injection": "^6.2|^7.0", "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4.21|^6.2.7|^7.0", + "symfony/form": "^5.4.38|^6.4.6|^7.0.6", "symfony/http-kernel": "^6.3|^7.0", "symfony/lock": "^6.3|^7.0", "symfony/messenger": "^5.4|^6.0|^7.0", @@ -7705,7 +7820,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.5" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.6" }, "funding": [ { @@ -7721,20 +7836,20 @@ "type": "tidelift" } ], - "time": "2024-02-27T12:33:30+00:00" + "time": "2024-03-19T09:28:31+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "0de4778d66169d65a4fa7fb5cb8742e6e924505b" + "reference": "386972bc34e68d58f304abc82b8824e2af2618b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/0de4778d66169d65a4fa7fb5cb8742e6e924505b", - "reference": "0de4778d66169d65a4fa7fb5cb8742e6e924505b", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/386972bc34e68d58f304abc82b8824e2af2618b7", + "reference": "386972bc34e68d58f304abc82b8824e2af2618b7", "shasum": "" }, "require": { @@ -7777,7 +7892,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v6.4.4" + "source": "https://github.com/symfony/doctrine-messenger/tree/v6.4.6" }, "funding": [ { @@ -7793,7 +7908,7 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-03-19T09:23:21+00:00" }, { "name": "symfony/dom-crawler", @@ -7864,16 +7979,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c725219bdf2afc59423c32793d5019d2a904e13a" + "reference": "64db1c1802e3a4557e37ba33031ac39f452ac5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c725219bdf2afc59423c32793d5019d2a904e13a", - "reference": "c725219bdf2afc59423c32793d5019d2a904e13a", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/64db1c1802e3a4557e37ba33031ac39f452ac5d4", + "reference": "64db1c1802e3a4557e37ba33031ac39f452ac5d4", "shasum": "" }, "require": { @@ -7919,7 +8034,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.4" + "source": "https://github.com/symfony/error-handler/tree/v6.4.6" }, "funding": [ { @@ -7935,7 +8050,7 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-03-19T11:56:30+00:00" }, { "name": "symfony/event-dispatcher", @@ -8019,16 +8134,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.0", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "4e64b49bf370ade88e567de29465762e316e4224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224", + "reference": "4e64b49bf370ade88e567de29465762e316e4224", "shasum": "" }, "require": { @@ -8075,7 +8190,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2" }, "funding": [ { @@ -8091,7 +8206,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/expression-language", @@ -8159,16 +8274,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + "reference": "9919b5509ada52cc7f66f9a35c86a4a29955c9d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/9919b5509ada52cc7f66f9a35c86a4a29955c9d3", + "reference": "9919b5509ada52cc7f66f9a35c86a4a29955c9d3", "shasum": "" }, "require": { @@ -8202,7 +8317,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.3" + "source": "https://github.com/symfony/filesystem/tree/v6.4.6" }, "funding": [ { @@ -8218,7 +8333,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-03-21T19:36:20+00:00" }, { "name": "symfony/finder", @@ -8286,16 +8401,16 @@ }, { "name": "symfony/form", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "c72cf9aab0d6c6db64358f9dd0ab391c2cc6014a" + "reference": "57bc474472f488f3c7fcf1b1448f793caadb4ed0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/c72cf9aab0d6c6db64358f9dd0ab391c2cc6014a", - "reference": "c72cf9aab0d6c6db64358f9dd0ab391c2cc6014a", + "url": "https://api.github.com/repos/symfony/form/zipball/57bc474472f488f3c7fcf1b1448f793caadb4ed0", + "reference": "57bc474472f488f3c7fcf1b1448f793caadb4ed0", "shasum": "" }, "require": { @@ -8363,7 +8478,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.4.4" + "source": "https://github.com/symfony/form/tree/v6.4.6" }, "funding": [ { @@ -8379,20 +8494,20 @@ "type": "tidelift" } ], - "time": "2024-02-12T11:14:32+00:00" + "time": "2024-03-27T22:00:14+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "c76d3881596860ead95f5444a5ce4414447f0067" + "reference": "49093e57c7eea2ecd1603b0218c797fc37514ae9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c76d3881596860ead95f5444a5ce4414447f0067", - "reference": "c76d3881596860ead95f5444a5ce4414447f0067", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/49093e57c7eea2ecd1603b0218c797fc37514ae9", + "reference": "49093e57c7eea2ecd1603b0218c797fc37514ae9", "shasum": "" }, "require": { @@ -8511,7 +8626,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.4" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.6" }, "funding": [ { @@ -8527,7 +8642,7 @@ "type": "tidelift" } ], - "time": "2024-02-22T22:50:59+00:00" + "time": "2024-03-23T16:06:09+00:00" }, { "name": "symfony/http-foundation", @@ -8608,16 +8723,16 @@ }, { "name": "symfony/http-kernel", - "version": "v6.4.5", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f6947cb939d8efee137797382cb4db1af653ef75" + "reference": "060038863743fd0cd982be06acecccf246d35653" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f6947cb939d8efee137797382cb4db1af653ef75", - "reference": "f6947cb939d8efee137797382cb4db1af653ef75", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/060038863743fd0cd982be06acecccf246d35653", + "reference": "060038863743fd0cd982be06acecccf246d35653", "shasum": "" }, "require": { @@ -8701,7 +8816,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.5" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.6" }, "funding": [ { @@ -8717,20 +8832,20 @@ "type": "tidelift" } ], - "time": "2024-03-04T21:00:47+00:00" + "time": "2024-04-03T06:09:15+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "791c5d31a8204cf3db0c66faab70282307f4376b" + "reference": "677f34a6f4b4559e08acf73ae0aec460479e5859" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/791c5d31a8204cf3db0c66faab70282307f4376b", - "reference": "791c5d31a8204cf3db0c66faab70282307f4376b", + "url": "https://api.github.com/repos/symfony/mailer/zipball/677f34a6f4b4559e08acf73ae0aec460479e5859", + "reference": "677f34a6f4b4559e08acf73ae0aec460479e5859", "shasum": "" }, "require": { @@ -8781,7 +8896,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.4" + "source": "https://github.com/symfony/mailer/tree/v6.4.6" }, "funding": [ { @@ -8797,20 +8912,20 @@ "type": "tidelift" } ], - "time": "2024-02-03T21:33:47+00:00" + "time": "2024-03-27T21:14:17+00:00" }, { "name": "symfony/messenger", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "443b2644a3f43678adb5281a4e3fae6fbf2473c7" + "reference": "4b7f073d341f6d0b431a1c643b40aa21506ca820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/443b2644a3f43678adb5281a4e3fae6fbf2473c7", - "reference": "443b2644a3f43678adb5281a4e3fae6fbf2473c7", + "url": "https://api.github.com/repos/symfony/messenger/zipball/4b7f073d341f6d0b431a1c643b40aa21506ca820", + "reference": "4b7f073d341f6d0b431a1c643b40aa21506ca820", "shasum": "" }, "require": { @@ -8868,7 +8983,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v6.4.4" + "source": "https://github.com/symfony/messenger/tree/v6.4.6" }, "funding": [ { @@ -8884,20 +8999,20 @@ "type": "tidelift" } ], - "time": "2024-02-26T07:52:26+00:00" + "time": "2024-03-19T11:56:30+00:00" }, { "name": "symfony/mime", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34" + "reference": "14762b86918823cb42e3558cdcca62e58b5227fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34", + "url": "https://api.github.com/repos/symfony/mime/zipball/14762b86918823cb42e3558cdcca62e58b5227fe", + "reference": "14762b86918823cb42e3558cdcca62e58b5227fe", "shasum": "" }, "require": { @@ -8918,6 +9033,7 @@ "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", "symfony/serializer": "^6.3.2|^7.0" @@ -8952,7 +9068,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.3" + "source": "https://github.com/symfony/mime/tree/v6.4.6" }, "funding": [ { @@ -8968,7 +9084,7 @@ "type": "tidelift" } ], - "time": "2024-01-30T08:32:12+00:00" + "time": "2024-03-21T19:36:20+00:00" }, { "name": "symfony/options-resolver", @@ -9735,16 +9851,16 @@ }, { "name": "symfony/property-access", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "c0664db266024013e31446dd690b6bfcf218ad93" + "reference": "304e5559cd3ebcfb5d743bd21a3d25eb3b7a6ae7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/c0664db266024013e31446dd690b6bfcf218ad93", - "reference": "c0664db266024013e31446dd690b6bfcf218ad93", + "url": "https://api.github.com/repos/symfony/property-access/zipball/304e5559cd3ebcfb5d743bd21a3d25eb3b7a6ae7", + "reference": "304e5559cd3ebcfb5d743bd21a3d25eb3b7a6ae7", "shasum": "" }, "require": { @@ -9792,7 +9908,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.4.4" + "source": "https://github.com/symfony/property-access/tree/v6.4.6" }, "funding": [ { @@ -9808,20 +9924,20 @@ "type": "tidelift" } ], - "time": "2024-02-16T13:31:43+00:00" + "time": "2024-03-19T11:56:30+00:00" }, { "name": "symfony/property-info", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "e96d740ab5ac39aa530c8eaa0720ea8169118e26" + "reference": "893120c46f8b78086d5bee90f91d6ff85e4057f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/e96d740ab5ac39aa530c8eaa0720ea8169118e26", - "reference": "e96d740ab5ac39aa530c8eaa0720ea8169118e26", + "url": "https://api.github.com/repos/symfony/property-info/zipball/893120c46f8b78086d5bee90f91d6ff85e4057f2", + "reference": "893120c46f8b78086d5bee90f91d6ff85e4057f2", "shasum": "" }, "require": { @@ -9875,7 +9991,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.3" + "source": "https://github.com/symfony/property-info/tree/v6.4.6" }, "funding": [ { @@ -9891,20 +10007,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-03-27T22:00:14+00:00" }, { "name": "symfony/routing", - "version": "v6.4.5", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4" + "reference": "f2591fd1f8c6e3734656b5d6b3829e8bf81f507c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7fe30068e207d9c31c0138501ab40358eb2d49a4", - "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4", + "url": "https://api.github.com/repos/symfony/routing/zipball/f2591fd1f8c6e3734656b5d6b3829e8bf81f507c", + "reference": "f2591fd1f8c6e3734656b5d6b3829e8bf81f507c", "shasum": "" }, "require": { @@ -9958,7 +10074,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.5" + "source": "https://github.com/symfony/routing/tree/v6.4.6" }, "funding": [ { @@ -9974,7 +10090,7 @@ "type": "tidelift" } ], - "time": "2024-02-27T12:33:30+00:00" + "time": "2024-03-28T13:28:49+00:00" }, { "name": "symfony/runtime", @@ -10139,16 +10255,16 @@ }, { "name": "symfony/security-bundle", - "version": "v6.4.5", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "b7825ec970f51fcc4982397856405728544df9ce" + "reference": "232f25ff849353d6493cb34bfc1c5f293d8ff9c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/b7825ec970f51fcc4982397856405728544df9ce", - "reference": "b7825ec970f51fcc4982397856405728544df9ce", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/232f25ff849353d6493cb34bfc1c5f293d8ff9c3", + "reference": "232f25ff849353d6493cb34bfc1c5f293d8ff9c3", "shasum": "" }, "require": { @@ -10231,7 +10347,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.4.5" + "source": "https://github.com/symfony/security-bundle/tree/v6.4.6" }, "funding": [ { @@ -10247,7 +10363,7 @@ "type": "tidelift" } ], - "time": "2024-03-02T12:45:30+00:00" + "time": "2024-03-15T12:52:45+00:00" }, { "name": "symfony/security-core", @@ -10493,16 +10609,16 @@ }, { "name": "symfony/serializer", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "88da7f8fe03c5f4c2a69da907f1de03fab2e6872" + "reference": "3697adf91f83516c86b4912c08c28084711ed560" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/88da7f8fe03c5f4c2a69da907f1de03fab2e6872", - "reference": "88da7f8fe03c5f4c2a69da907f1de03fab2e6872", + "url": "https://api.github.com/repos/symfony/serializer/zipball/3697adf91f83516c86b4912c08c28084711ed560", + "reference": "3697adf91f83516c86b4912c08c28084711ed560", "shasum": "" }, "require": { @@ -10571,7 +10687,7 @@ "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/v6.4.4" + "source": "https://github.com/symfony/serializer/tree/v6.4.6" }, "funding": [ { @@ -10587,20 +10703,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-03-27T22:00:14+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.1", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + "reference": "11bbf19a0fb7b36345861e85c5768844c552906e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e", + "reference": "11bbf19a0fb7b36345861e85c5768844c552906e", "shasum": "" }, "require": { @@ -10653,7 +10769,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.2" }, "funding": [ { @@ -10669,7 +10785,7 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2023-12-19T21:51:00+00:00" }, { "name": "symfony/stopwatch", @@ -10916,16 +11032,16 @@ }, { "name": "symfony/translation-contracts", - "version": "v2.5.2", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" + "reference": "b0073a77ac0b7ea55131020e87b1e3af540f4664" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", - "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b0073a77ac0b7ea55131020e87b1e3af540f4664", + "reference": "b0073a77ac0b7ea55131020e87b1e3af540f4664", "shasum": "" }, "require": { @@ -10974,7 +11090,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.3" }, "funding": [ { @@ -10990,20 +11106,20 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/twig-bridge", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "256f330026d1c97187b61aa5c29e529499877f13" + "reference": "f150e06e2fbe8004dbcaa66a46bf20b2b3a99308" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/256f330026d1c97187b61aa5c29e529499877f13", - "reference": "256f330026d1c97187b61aa5c29e529499877f13", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/f150e06e2fbe8004dbcaa66a46bf20b2b3a99308", + "reference": "f150e06e2fbe8004dbcaa66a46bf20b2b3a99308", "shasum": "" }, "require": { @@ -11083,7 +11199,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.4" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.6" }, "funding": [ { @@ -11099,7 +11215,7 @@ "type": "tidelift" } ], - "time": "2024-02-15T11:26:02+00:00" + "time": "2024-03-28T21:00:57+00:00" }, { "name": "symfony/twig-bundle", @@ -11187,16 +11303,16 @@ }, { "name": "symfony/validator", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "1cf92edc9a94d16275efef949fa6748d11cc8f47" + "reference": "ca1d78e8677e966e307a63799677b64b194d735d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/1cf92edc9a94d16275efef949fa6748d11cc8f47", - "reference": "1cf92edc9a94d16275efef949fa6748d11cc8f47", + "url": "https://api.github.com/repos/symfony/validator/zipball/ca1d78e8677e966e307a63799677b64b194d735d", + "reference": "ca1d78e8677e966e307a63799677b64b194d735d", "shasum": "" }, "require": { @@ -11263,7 +11379,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.4" + "source": "https://github.com/symfony/validator/tree/v6.4.6" }, "funding": [ { @@ -11279,20 +11395,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-03-27T22:00:14+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "b439823f04c98b84d4366c79507e9da6230944b1" + "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b439823f04c98b84d4366c79507e9da6230944b1", - "reference": "b439823f04c98b84d4366c79507e9da6230944b1", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/95bd2706a97fb875185b51ecaa6112ec184233d4", + "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4", "shasum": "" }, "require": { @@ -11348,7 +11464,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.4" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.6" }, "funding": [ { @@ -11364,20 +11480,20 @@ "type": "tidelift" } ], - "time": "2024-02-15T11:23:52+00:00" + "time": "2024-03-19T11:56:30+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b" + "reference": "20888cf4d11de203613515cf0587828bf5af0fe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0bd342e24aef49fc82a21bd4eedd3e665d177e5b", - "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/20888cf4d11de203613515cf0587828bf5af0fe7", + "reference": "20888cf4d11de203613515cf0587828bf5af0fe7", "shasum": "" }, "require": { @@ -11385,6 +11501,8 @@ "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", @@ -11423,7 +11541,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.4" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.6" }, "funding": [ { @@ -11439,7 +11557,7 @@ "type": "tidelift" } ], - "time": "2024-02-26T08:37:45+00:00" + "time": "2024-03-20T21:07:14+00:00" }, { "name": "symfony/workflow", @@ -11653,21 +11771,21 @@ }, { "name": "twig/string-extra", - "version": "v3.8.0", + "version": "v3.9.0", "source": { "type": "git", "url": "https://github.com/twigphp/string-extra.git", - "reference": "b0c9037d96baff79abe368dc092a59b726517548" + "reference": "5ff1c41366aa003d45f6e2707c5d698c1b37ff99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/string-extra/zipball/b0c9037d96baff79abe368dc092a59b726517548", - "reference": "b0c9037d96baff79abe368dc092a59b726517548", + "url": "https://api.github.com/repos/twigphp/string-extra/zipball/5ff1c41366aa003d45f6e2707c5d698c1b37ff99", + "reference": "5ff1c41366aa003d45f6e2707c5d698c1b37ff99", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/string": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.4|^7.0", "symfony/translation-contracts": "^1.1|^2|^3", "twig/twig": "^3.0" }, @@ -11704,7 +11822,7 @@ "unicode" ], "support": { - "source": "https://github.com/twigphp/string-extra/tree/v3.8.0" + "source": "https://github.com/twigphp/string-extra/tree/v3.9.0" }, "funding": [ { @@ -11716,34 +11834,41 @@ "type": "tidelift" } ], - "time": "2023-11-21T14:02:01+00:00" + "time": "2024-02-10T08:52:03+00:00" }, { "name": "twig/twig", - "version": "v3.8.0", + "version": "v3.9.3", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + "reference": "a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58", + "reference": "a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-php80": "^1.22" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { "Twig\\": "src/" } @@ -11776,7 +11901,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + "source": "https://github.com/twigphp/Twig/tree/v3.9.3" }, "funding": [ { @@ -11788,7 +11913,7 @@ "type": "tidelift" } ], - "time": "2023-11-21T18:54:41+00:00" + "time": "2024-04-18T11:59:33+00:00" }, { "name": "webmozart/assert", @@ -11909,28 +12034,28 @@ }, { "name": "bacon/bacon-qr-code", - "version": "2.0.8", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/Bacon/BaconQrCode.git", - "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22" + "reference": "510de6eca6248d77d31b339d62437cc995e2fb41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22", - "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/510de6eca6248d77d31b339d62437cc995e2fb41", + "reference": "510de6eca6248d77d31b339d62437cc995e2fb41", "shasum": "" }, "require": { "dasprid/enum": "^1.0.3", "ext-iconv": "*", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "phly/keep-a-changelog": "^2.1", - "phpunit/phpunit": "^7 | ^8 | ^9", - "spatie/phpunit-snapshot-assertions": "^4.2.9", - "squizlabs/php_codesniffer": "^3.4" + "phly/keep-a-changelog": "^2.12", + "phpunit/phpunit": "^10.5.11 || 11.0.4", + "spatie/phpunit-snapshot-assertions": "^5.1.5", + "squizlabs/php_codesniffer": "^3.9" }, "suggest": { "ext-imagick": "to generate QR code images" @@ -11957,9 +12082,9 @@ "homepage": "https://github.com/Bacon/BaconQrCode", "support": { "issues": "https://github.com/Bacon/BaconQrCode/issues", - "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8" + "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.0" }, - "time": "2022-12-07T17:46:57+00:00" + "time": "2024-04-18T11:16:25+00:00" }, { "name": "bamarni/composer-bin-plugin", @@ -12477,29 +12602,26 @@ }, { "name": "endroid/qr-code", - "version": "5.0.5", + "version": "5.0.8", "source": { "type": "git", "url": "https://github.com/endroid/qr-code.git", - "reference": "739fc545bfade2470765219dc2a615a6f1e94987" + "reference": "cb6b31a7aa99df9c6c2dc09a5fa2aaa617f6e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/endroid/qr-code/zipball/739fc545bfade2470765219dc2a615a6f1e94987", - "reference": "739fc545bfade2470765219dc2a615a6f1e94987", + "url": "https://api.github.com/repos/endroid/qr-code/zipball/cb6b31a7aa99df9c6c2dc09a5fa2aaa617f6e5bb", + "reference": "cb6b31a7aa99df9c6c2dc09a5fa2aaa617f6e5bb", "shasum": "" }, "require": { - "bacon/bacon-qr-code": "^2.0.5", + "bacon/bacon-qr-code": "^3.0", "php": "^8.1" }, - "conflict": { - "khanamiryan/qrcode-detector-decoder": "^1.0.6" - }, "require-dev": { "endroid/quality": "dev-main", "ext-gd": "*", - "khanamiryan/qrcode-detector-decoder": "^1.0.4||^2.0.2", + "khanamiryan/qrcode-detector-decoder": "^2.0.2", "setasign/fpdf": "^1.8.2" }, "suggest": { @@ -12540,7 +12662,7 @@ ], "support": { "issues": "https://github.com/endroid/qr-code/issues", - "source": "https://github.com/endroid/qr-code/tree/5.0.5" + "source": "https://github.com/endroid/qr-code/tree/5.0.8" }, "funding": [ { @@ -12548,7 +12670,7 @@ "type": "github" } ], - "time": "2024-03-03T18:17:54+00:00" + "time": "2024-04-19T08:36:52+00:00" }, { "name": "firebase/php-jwt", @@ -12712,16 +12834,16 @@ }, { "name": "monolog/monolog", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", "shasum": "" }, "require": { @@ -12744,7 +12866,7 @@ "phpstan/phpstan": "^1.9", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.1", + "phpunit/phpunit": "^10.5.17", "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", "symfony/mailer": "^5.4 || ^6", @@ -12797,7 +12919,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.5.0" + "source": "https://github.com/Seldaek/monolog/tree/3.6.0" }, "funding": [ { @@ -12809,7 +12931,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:32:31+00:00" + "time": "2024-04-12T21:02:21+00:00" }, { "name": "nelmio/cors-bundle", @@ -13122,16 +13244,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.59", + "version": "1.10.67", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e607609388d3a6d418a50a49f7940e8086798281" + "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e607609388d3a6d418a50a49f7940e8086798281", - "reference": "e607609388d3a6d418a50a49f7940e8086798281", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/16ddbe776f10da6a95ebd25de7c1dbed397dc493", + "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493", "shasum": "" }, "require": { @@ -13174,13 +13296,9 @@ { "url": "https://github.com/phpstan", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" } ], - "time": "2024-02-20T13:59:13+00:00" + "time": "2024-04-16T07:22:02+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -13236,22 +13354,22 @@ }, { "name": "phpstan/phpstan-symfony", - "version": "1.3.8", + "version": "1.3.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "d8a0bc03a68d95288b6471c37d435647fbdaff1a" + "reference": "f4b9407fa3203aebafd422ae8f0eb1ef94659a80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/d8a0bc03a68d95288b6471c37d435647fbdaff1a", - "reference": "d8a0bc03a68d95288b6471c37d435647fbdaff1a", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/f4b9407fa3203aebafd422ae8f0eb1ef94659a80", + "reference": "f4b9407fa3203aebafd422ae8f0eb1ef94659a80", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10.36" + "phpstan/phpstan": "^1.10.62" }, "conflict": { "symfony/framework-bundle": "<3.0" @@ -13302,9 +13420,9 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.8" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.12" }, - "time": "2024-03-05T16:33:08+00:00" + "time": "2024-04-14T13:30:23+00:00" }, { "name": "sabberworm/php-css-parser", @@ -13541,16 +13659,16 @@ }, { "name": "spomky-labs/otphp", - "version": "11.2.0", + "version": "11.2.2", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795" + "reference": "b737d1c6330beae7c0bc225d3e848805b352fe42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9a1569038bb1c8e98040b14b8bcbba54f25e7795", - "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/b737d1c6330beae7c0bc225d3e848805b352fe42", + "reference": "b737d1c6330beae7c0bc225d3e848805b352fe42", "shasum": "" }, "require": { @@ -13560,17 +13678,17 @@ }, "require-dev": { "ekino/phpstan-banned-code": "^1.0", - "infection/infection": "^0.26", + "infection/infection": "^0.26|^0.27|^0.28", "php-parallel-lint/php-parallel-lint": "^1.3", "phpstan/phpstan": "^1.0", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5.26", + "phpunit/phpunit": "^9.5.26|^10.0|^11.0", "qossmic/deptrac-shim": "^1.0", - "rector/rector": "^0.15", - "symfony/phpunit-bridge": "^6.1", - "symplify/easy-coding-standard": "^11.0" + "rector/rector": "1.0", + "symfony/phpunit-bridge": "^6.1|^7.0", + "symplify/easy-coding-standard": "^12.0" }, "type": "library", "autoload": { @@ -13605,7 +13723,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/11.2.0" + "source": "https://github.com/Spomky-Labs/otphp/tree/11.2.2" }, "funding": [ { @@ -13617,7 +13735,7 @@ "type": "patreon" } ], - "time": "2023-03-16T19:16:25+00:00" + "time": "2024-04-15T07:35:15+00:00" }, { "name": "symfony/debug-bundle", @@ -13834,23 +13952,23 @@ }, { "name": "symfony/http-client", - "version": "v6.4.5", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "f3c86a60a3615f466333a11fd42010d4382a82c7" + "reference": "6a46c0ea9b099f9a5132d560a51833ffcbd5b0d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/f3c86a60a3615f466333a11fd42010d4382a82c7", - "reference": "f3c86a60a3615f466333a11fd42010d4382a82c7", + "url": "https://api.github.com/repos/symfony/http-client/zipball/6a46c0ea9b099f9a5132d560a51833ffcbd5b0d9", + "reference": "6a46c0ea9b099f9a5132d560a51833ffcbd5b0d9", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "^3", + "symfony/http-client-contracts": "^3.4.1", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -13868,7 +13986,7 @@ "amphp/http-client": "^4.2.1", "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", + "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", @@ -13907,7 +14025,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.5" + "source": "https://github.com/symfony/http-client/tree/v6.4.6" }, "funding": [ { @@ -13923,20 +14041,20 @@ "type": "tidelift" } ], - "time": "2024-03-02T12:45:30+00:00" + "time": "2024-04-01T20:35:50+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.4.0", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "1ee70e699b41909c209a0c930f11034b93578654" + "reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/1ee70e699b41909c209a0c930f11034b93578654", - "reference": "1ee70e699b41909c209a0c930f11034b93578654", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e", + "reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e", "shasum": "" }, "require": { @@ -13985,7 +14103,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.2" }, "funding": [ { @@ -14001,20 +14119,20 @@ "type": "tidelift" } ], - "time": "2023-07-30T20:28:31+00:00" + "time": "2024-04-01T18:51:09+00:00" }, { "name": "symfony/lock", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "1cabf3cc775b1aa6008ebd471fa773444af4e956" + "reference": "53f0dbf55871774bf42773ed478b7106486b8b98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/1cabf3cc775b1aa6008ebd471fa773444af4e956", - "reference": "1cabf3cc775b1aa6008ebd471fa773444af4e956", + "url": "https://api.github.com/repos/symfony/lock/zipball/53f0dbf55871774bf42773ed478b7106486b8b98", + "reference": "53f0dbf55871774bf42773ed478b7106486b8b98", "shasum": "" }, "require": { @@ -14064,7 +14182,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v6.4.3" + "source": "https://github.com/symfony/lock/tree/v6.4.6" }, "funding": [ { @@ -14080,7 +14198,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-03-19T09:23:21+00:00" }, { "name": "symfony/maker-bundle", @@ -14414,16 +14532,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.4.4", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "16ed5bdfd18e14fc7de347c8688e8ac479284222" + "reference": "3065d1c5b4cd0a46b11845b705d21ee692e52cd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/16ed5bdfd18e14fc7de347c8688e8ac479284222", - "reference": "16ed5bdfd18e14fc7de347c8688e8ac479284222", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/3065d1c5b4cd0a46b11845b705d21ee692e52cd6", + "reference": "3065d1c5b4cd0a46b11845b705d21ee692e52cd6", "shasum": "" }, "require": { @@ -14475,7 +14593,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.4" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.6" }, "funding": [ { @@ -14491,7 +14609,7 @@ "type": "tidelift" } ], - "time": "2024-02-08T14:08:19+00:00" + "time": "2024-03-19T11:56:30+00:00" }, { "name": "symfony/redis-messenger", diff --git a/config/bundles.php b/config/bundles.php index e1382c8a5..a4b46ba5d 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -27,6 +27,7 @@ Draw\Bundle\SonataIntegrationBundle\DrawSonataIntegrationBundle::class => ['all' => true], Draw\Bundle\FrameworkExtraBundle\DrawFrameworkExtraBundle::class => ['all' => true], Doctrine\Bundle\MongoDBBundle\DoctrineMongoDBBundle::class => ['all' => true], - Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Draw\Bundle\SonataImportBundle\DrawSonataImportBundle::class => ['all' => true], + Knp\DoctrineBehaviors\DoctrineBehaviorsBundle::class => ['all' => true], + Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], ]; diff --git a/config/packages/draw_sonata_import.yaml b/config/packages/draw_sonata_import.yaml index 1284b9161..de89758ad 100644 --- a/config/packages/draw_sonata_import.yaml +++ b/config/packages/draw_sonata_import.yaml @@ -4,3 +4,6 @@ draw_sonata_import: alias: 'Tag' 'App\Entity\UserTag': alias: 'UserTag' + handlers: + doctrine_translation: + supported_locales: ['en', 'fr'] diff --git a/packages/sonata-import-bundle/Admin/ColumnAdmin.php b/packages/sonata-import-bundle/Admin/ColumnAdmin.php index 0626a4db6..713ba21fa 100644 --- a/packages/sonata-import-bundle/Admin/ColumnAdmin.php +++ b/packages/sonata-import-bundle/Admin/ColumnAdmin.php @@ -2,12 +2,11 @@ namespace Draw\Bundle\SonataImportBundle\Admin; -use Draw\Bundle\SonataImportBundle\Column\MappedToOptionBuilder\MappedToOptionBuilderInterface; +use Draw\Bundle\SonataImportBundle\Column\MappedToOptionBuilderAggregator; use Draw\Bundle\SonataImportBundle\Entity\Column; use Sonata\AdminBundle\Admin\AbstractAdmin; use Sonata\AdminBundle\Form\FormMapper; use Symfony\Component\DependencyInjection\Attribute\AutoconfigureTag; -use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; /** @@ -26,8 +25,7 @@ class ColumnAdmin extends AbstractAdmin { public function __construct( - #[TaggedIterator(MappedToOptionBuilderInterface::class)] - private iterable $mappedToOptionBuilders + private MappedToOptionBuilderAggregator $mappedToOptionBuilderAggregator ) { parent::__construct(); } @@ -35,14 +33,28 @@ public function __construct( protected function configureFormFields(FormMapper $form): void { $form - ->add('headerName') - ->add('sample') + ->add( + 'headerName', + options: [ + 'disabled' => true, + ] + ) + ->add( + 'sample', + options: [ + 'required' => false, + 'disabled' => true, + ] + ) ->add( 'mappedTo', ChoiceType::class, [ 'required' => false, 'choices' => $this->loadMappedToOptions($this->getSubject()), + 'attr' => [ + 'data-sonata-select2' => 'false', + ], ] ) ->add('isIdentifier') @@ -52,15 +64,20 @@ protected function configureFormFields(FormMapper $form): void private function loadMappedToOptions(Column $column): array { - $options = []; + $options = $this->mappedToOptionBuilderAggregator->getOptions($column); + + $result = []; + // Iterate over each element in the original array + foreach ($options as $option) { + $parts = explode('.', $option); + if (1 === \count($parts)) { + $result[$option] = $option; + continue; + } - foreach ($this->mappedToOptionBuilders as $mappedToOptionBuilder) { - $options = $mappedToOptionBuilder->getOptions( - $column, - $options - ); + $result[$parts[0]][$option] = $option; } - return $options; + return $result; } } diff --git a/packages/sonata-import-bundle/Admin/ImportAdmin.php b/packages/sonata-import-bundle/Admin/ImportAdmin.php index c6e65fe0b..168af6a4c 100644 --- a/packages/sonata-import-bundle/Admin/ImportAdmin.php +++ b/packages/sonata-import-bundle/Admin/ImportAdmin.php @@ -253,16 +253,12 @@ private function processFileUpload(Import $import, ?UploadedFile $file = null): $samples[] = $row; } - $columns = $this->columnFactory->generateColumns( - $import->getEntityClass(), + $this->columnFactory->buildColumns( + $import, $headers, $samples ); - foreach ($columns as $column) { - $import->addColumn($column); - } - $import->setState(Import::STATE_CONFIGURATION); } diff --git a/packages/sonata-import-bundle/Column/ColumnBuilder/ColumnBuilderInterface.php b/packages/sonata-import-bundle/Column/ColumnBuilder/ColumnBuilderInterface.php index dc9682d2d..f09bc4813 100644 --- a/packages/sonata-import-bundle/Column/ColumnBuilder/ColumnBuilderInterface.php +++ b/packages/sonata-import-bundle/Column/ColumnBuilder/ColumnBuilderInterface.php @@ -8,5 +8,5 @@ #[AutoconfigureTag(ColumnBuilderInterface::class)] interface ColumnBuilderInterface { - public function extract(string $class, Column $column, array $samples): ?Column; + public function extract(Column $column, array $samples): ?Column; } diff --git a/packages/sonata-import-bundle/Column/ColumnBuilder/ColumnInfo.php b/packages/sonata-import-bundle/Column/ColumnBuilder/ColumnInfo.php new file mode 100644 index 000000000..2c4a21197 --- /dev/null +++ b/packages/sonata-import-bundle/Column/ColumnBuilder/ColumnInfo.php @@ -0,0 +1,7 @@ +getImport()->getEntityClass(); $headerName = $column->getHeaderName(); $manager = $this->managerRegistry->getManagerForClass($class); $metadata = $manager->getClassMetadata($class); diff --git a/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineAssociationFieldColumnBuilder.php b/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineAssociationFieldColumnBuilder.php index fa6535bca..64ec0af7b 100644 --- a/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineAssociationFieldColumnBuilder.php +++ b/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineAssociationFieldColumnBuilder.php @@ -13,8 +13,9 @@ public function __construct(private ManagerRegistry $managerRegistry) { } - public function extract(string $class, Column $column, array $samples): ?Column + public function extract(Column $column, array $samples): ?Column { + $class = $column->getImport()->getEntityClass(); $headerName = $column->getHeaderName(); $manager = $this->managerRegistry->getManagerForClass($class); $metadata = $manager->getClassMetadata($class); diff --git a/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineAssociationPathColumnBuilder.php b/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineAssociationPathColumnBuilder.php index 1baa54eb9..aef12c3ca 100644 --- a/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineAssociationPathColumnBuilder.php +++ b/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineAssociationPathColumnBuilder.php @@ -13,8 +13,9 @@ public function __construct(private ManagerRegistry $managerRegistry) { } - public function extract(string $class, Column $column, array $samples): ?Column + public function extract(Column $column, array $samples): ?Column { + $class = $column->getImport()->getEntityClass(); $headerName = $column->getHeaderName(); $manager = $this->managerRegistry->getManagerForClass($class); $metadata = $manager->getClassMetadata($class); diff --git a/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineFieldColumnBuilder.php b/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineFieldColumnBuilder.php index b2968e0b3..0f16cd864 100644 --- a/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineFieldColumnBuilder.php +++ b/packages/sonata-import-bundle/Column/ColumnBuilder/Doctrine/DoctrineFieldColumnBuilder.php @@ -13,8 +13,9 @@ public function __construct(private ManagerRegistry $managerRegistry) { } - public function extract(string $class, Column $column, array $samples): ?Column + public function extract(Column $column, array $samples): ?Column { + $class = $column->getImport()->getEntityClass(); $headerName = $column->getHeaderName(); $manager = $this->managerRegistry->getManagerForClass($class); $metadata = $manager->getClassMetadata($class); @@ -42,6 +43,5 @@ public function extract(string $class, Column $column, array $samples): ?Column } return $columnInfo; - } } diff --git a/packages/sonata-import-bundle/Column/ColumnBuilder/MappedToOptionColumnBuilder.php b/packages/sonata-import-bundle/Column/ColumnBuilder/MappedToOptionColumnBuilder.php new file mode 100644 index 000000000..e3cb4d80a --- /dev/null +++ b/packages/sonata-import-bundle/Column/ColumnBuilder/MappedToOptionColumnBuilder.php @@ -0,0 +1,34 @@ +getMappedTo()) { + return null; + } + + if (\in_array($column->getHeaderName(), $this->mappedToOptionBuilderAggregator->getOptions($column))) { + return (new Column()) + ->setMappedTo($column->getHeaderName()); + } + + return null; + } +} diff --git a/packages/sonata-import-bundle/Column/ColumnBuilder/NamedBaseIdentifierColumnBuilder.php b/packages/sonata-import-bundle/Column/ColumnBuilder/NamedBaseIdentifierColumnBuilder.php index 3a6b7ddad..13b72b840 100644 --- a/packages/sonata-import-bundle/Column/ColumnBuilder/NamedBaseIdentifierColumnBuilder.php +++ b/packages/sonata-import-bundle/Column/ColumnBuilder/NamedBaseIdentifierColumnBuilder.php @@ -8,7 +8,7 @@ class NamedBaseIdentifierColumnBuilder implements ColumnBuilderInterface { private static array $names = ['id']; - public function extract(string $class, Column $column, array $samples): ?Column + public function extract(Column $column, array $samples): ?Column { $headerName = $column->getHeaderName(); if (!\in_array(mb_strtolower($headerName), self::$names, true)) { diff --git a/packages/sonata-import-bundle/Column/ColumnBuilder/ReflectionColumnBuilder.php b/packages/sonata-import-bundle/Column/ColumnBuilder/ReflectionColumnBuilder.php index 737097b9a..da98a729c 100644 --- a/packages/sonata-import-bundle/Column/ColumnBuilder/ReflectionColumnBuilder.php +++ b/packages/sonata-import-bundle/Column/ColumnBuilder/ReflectionColumnBuilder.php @@ -6,8 +6,10 @@ class ReflectionColumnBuilder implements ColumnBuilderInterface { - public function extract(string $class, Column $column, array $samples): ?Column + public function extract(Column $column, array $samples): ?Column { + $class = $column->getImport()->getEntityClass(); + $headerName = $column->getHeaderName(); $reflectionClass = new \ReflectionClass($class); diff --git a/packages/sonata-import-bundle/Column/ColumnFactory.php b/packages/sonata-import-bundle/Column/ColumnFactory.php index c9c8bb41c..44180e822 100644 --- a/packages/sonata-import-bundle/Column/ColumnFactory.php +++ b/packages/sonata-import-bundle/Column/ColumnFactory.php @@ -4,6 +4,7 @@ use Draw\Bundle\SonataImportBundle\Column\ColumnBuilder\ColumnBuilderInterface; use Draw\Bundle\SonataImportBundle\Entity\Column; +use Draw\Bundle\SonataImportBundle\Entity\Import; use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; class ColumnFactory @@ -17,14 +18,12 @@ public function __construct( ) { } - /** - * @return Column[] - */ - public function generateColumns(string $class, array $headers, array $samples): array + public function buildColumns(Import $import, array $headers, array $samples): void { $columns = []; foreach ($headers as $index => $headerName) { $column = (new Column()) + ->setImport($import) ->setIsDate(false) ->setHeaderName($headerName); @@ -44,8 +43,8 @@ public function generateColumns(string $class, array $headers, array $samples): $columnSamples[] = $columnSample; } - foreach ($this->columnBuilders as $extractor) { - $columnInfo = $extractor->extract($class, clone $column, $columnSamples); + foreach ($this->columnBuilders as $columnBuilder) { + $columnInfo = $columnBuilder->extract(clone $column, $columnSamples); if ($columnInfo) { $this->assign($columnInfo, $column); } @@ -63,7 +62,9 @@ public function generateColumns(string $class, array $headers, array $samples): $columns[] = $column; } - return $columns; + foreach ($columns as $column) { + $import->addColumn($column); + } } private function assign(Column $source, Column $target): void diff --git a/packages/sonata-import-bundle/Column/MappedToOptionBuilder/DoctrineMappedToOptionBuilder.php b/packages/sonata-import-bundle/Column/MappedToOptionBuilder/DoctrineMappedToOptionBuilder.php index 2cd107b50..d04d4cae0 100644 --- a/packages/sonata-import-bundle/Column/MappedToOptionBuilder/DoctrineMappedToOptionBuilder.php +++ b/packages/sonata-import-bundle/Column/MappedToOptionBuilder/DoctrineMappedToOptionBuilder.php @@ -3,6 +3,7 @@ namespace Draw\Bundle\SonataImportBundle\Column\MappedToOptionBuilder; use Doctrine\ORM\Mapping\ClassMetadata; +use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\Persistence\ManagerRegistry; use Draw\Bundle\SonataImportBundle\Entity\Column; @@ -23,12 +24,15 @@ public function getOptions(Column $column, array $options): array return $options; } - $choices = []; - foreach ($metadata->fieldMappings as $fieldMapping) { - $choices[$fieldMapping['columnName']] = $fieldMapping['columnName']; + foreach ($metadata->fieldNames as $fieldName) { + $options[] = $fieldName; } foreach ($metadata->associationMappings as $name => $associationMapping) { + if (!($associationMapping['type'] & ClassMetadataInfo::TO_ONE)) { + continue; + } + $targetClassMetadata = $this->managerRegistry ->getManagerForClass($associationMapping['targetEntity']) ->getClassMetadata($associationMapping['targetEntity']); @@ -42,10 +46,10 @@ public function getOptions(Column $column, array $options): array continue; } - $choices[$name.'.'.$fieldName] = $name.'.'.$fieldName; + $options[] = $name.'.'.$fieldName; } } - return $choices; + return $options; } } diff --git a/packages/sonata-import-bundle/Column/MappedToOptionBuilder/DoctrineTranslationMappedToOptionBuilder.php b/packages/sonata-import-bundle/Column/MappedToOptionBuilder/DoctrineTranslationMappedToOptionBuilder.php new file mode 100644 index 000000000..a844c177c --- /dev/null +++ b/packages/sonata-import-bundle/Column/MappedToOptionBuilder/DoctrineTranslationMappedToOptionBuilder.php @@ -0,0 +1,86 @@ +getColumn(); + + if (!str_starts_with($column->getMappedTo(), 'translation#')) { + return; + } + + $model = $event->getEntity(); + + if (!$model instanceof TranslatableInterface) { + return; + } + + $fieldInfo = explode('#', $column->getMappedTo())[1]; + + [$locale, $fieldName] = explode('.', $fieldInfo); + + $model->translate($locale, false)->{'set'.ucfirst($fieldName)}($event->getValue()); + + $event->stopPropagation(); + } + + public function getOptions(Column $column, array $options): array + { + $class = $column->getImport()->getEntityClass(); + + $metadata = $this->managerRegistry->getManagerForClass($class)->getClassMetadata($class); + + if (!$metadata instanceof ClassMetadata) { + return $options; + } + + $reflectionClass = $metadata->getReflectionClass(); + + if (!$reflectionClass->implementsInterface(TranslatableInterface::class)) { + return $options; + } + + $translationClass = $reflectionClass->getMethod('getTranslationEntityClass')->invoke(null); + + $metadata = $this->managerRegistry + ->getManagerForClass($translationClass) + ->getClassMetadata($translationClass); + + if (!$metadata instanceof ClassMetadata) { + return $options; + } + + foreach ($metadata->fieldMappings as $field => $fieldMapping) { + if ($fieldMapping['id'] ?? false) { + continue; + } + + if ('locale' === $field) { + continue; + } + + foreach ($this->supportedLocales as $locale) { + $options[] = sprintf('translation#%s.%s', $locale, $field); + } + } + + return $options; + } +} diff --git a/packages/sonata-import-bundle/Column/MappedToOptionBuilder/MappedToOptionBuilderInterface.php b/packages/sonata-import-bundle/Column/MappedToOptionBuilder/MappedToOptionBuilderInterface.php index 06a83847d..2dcc7430f 100644 --- a/packages/sonata-import-bundle/Column/MappedToOptionBuilder/MappedToOptionBuilderInterface.php +++ b/packages/sonata-import-bundle/Column/MappedToOptionBuilder/MappedToOptionBuilderInterface.php @@ -11,7 +11,7 @@ interface MappedToOptionBuilderInterface /** * You must return the new options with the current one merged or modified. * - * @return array the options to be used for the mapped to field + * @return array the options to be used for the mapped to field */ public function getOptions(Column $column, array $options): array; } diff --git a/packages/sonata-import-bundle/Column/MappedToOptionBuilderAggregator.php b/packages/sonata-import-bundle/Column/MappedToOptionBuilderAggregator.php new file mode 100644 index 000000000..bd7507bcf --- /dev/null +++ b/packages/sonata-import-bundle/Column/MappedToOptionBuilderAggregator.php @@ -0,0 +1,33 @@ + + */ + #[TaggedIterator(MappedToOptionBuilderInterface::class)] + private iterable $mappedToOptionBuilders + ) { + } + + public function getOptions(Column $column): array + { + $options = []; + + foreach ($this->mappedToOptionBuilders as $mappedToOptionBuilder) { + $options = $mappedToOptionBuilder->getOptions( + $column, + $options + ); + } + + return $options; + } +} diff --git a/packages/sonata-import-bundle/DependencyInjection/Configuration.php b/packages/sonata-import-bundle/DependencyInjection/Configuration.php index 4f49144b2..935bcf96a 100755 --- a/packages/sonata-import-bundle/DependencyInjection/Configuration.php +++ b/packages/sonata-import-bundle/DependencyInjection/Configuration.php @@ -2,6 +2,8 @@ namespace Draw\Bundle\SonataImportBundle\DependencyInjection; +use Knp\DoctrineBehaviors\Contract\Entity\TranslatableInterface; +use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; @@ -47,8 +49,32 @@ public function getConfigTreeBuilder(): TreeBuilder ->end() ->end() ->end() + ->arrayNode('handlers') + ->append($this->createDoctrineTranslationNode()) + ->end() ->end(); return $treeBuilder; } + + private function createDoctrineTranslationNode(): ArrayNodeDefinition + { + $node = new ArrayNodeDefinition('doctrine_translation'); + + if (class_exists(TranslatableInterface::class)) { + $node->canBeDisabled(); + } else { + $node->canBeEnabled(); + } + + return + $node + ->addDefaultsIfNotSet() + ->children() + ->arrayNode('supported_locales') + ->defaultValue([]) + ->scalarPrototype()->end() + ->end() + ->end(); + } } diff --git a/packages/sonata-import-bundle/DependencyInjection/DrawSonataImportExtension.php b/packages/sonata-import-bundle/DependencyInjection/DrawSonataImportExtension.php index 13ff7ed83..d8b90e743 100644 --- a/packages/sonata-import-bundle/DependencyInjection/DrawSonataImportExtension.php +++ b/packages/sonata-import-bundle/DependencyInjection/DrawSonataImportExtension.php @@ -3,6 +3,7 @@ namespace Draw\Bundle\SonataImportBundle\DependencyInjection; use Draw\Bundle\SonataImportBundle\Column\ColumnBuilder\ColumnBuilderInterface; +use Draw\Bundle\SonataImportBundle\Column\MappedToOptionBuilder\DoctrineTranslationMappedToOptionBuilder; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader; @@ -19,5 +20,20 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container ->addTag('draw.sonata_import.extractor'); $container->setParameter('draw.sonata_import.classes', $mergedConfig['classes']); + + $this->loadDoctrineTranslationHandler($mergedConfig['handlers']['doctrine_translation'], $container); + } + + protected function loadDoctrineTranslationHandler(array $config, ContainerBuilder $container): void + { + if (!$this->isConfigEnabled($container, $config)) { + $container->removeDefinition(DoctrineTranslationMappedToOptionBuilder::class); + + return; + } + + $container + ->getDefinition(DoctrineTranslationMappedToOptionBuilder::class) + ->setArgument('$supportedLocales', $config['supported_locales']); } } diff --git a/packages/sonata-import-bundle/Entity/Column.php b/packages/sonata-import-bundle/Entity/Column.php index 1413ebb50..921f35c2f 100644 --- a/packages/sonata-import-bundle/Entity/Column.php +++ b/packages/sonata-import-bundle/Entity/Column.php @@ -74,7 +74,6 @@ public function getImport(): ?Import public function setImport(?Import $import): static { $this->import = $import; - $import->addColumn($this); return $this; } diff --git a/packages/sonata-import-bundle/Tests/ColumnFactoryTest.php b/packages/sonata-import-bundle/Tests/ColumnFactoryTest.php index 9ecd9daf1..17b1bffa3 100644 --- a/packages/sonata-import-bundle/Tests/ColumnFactoryTest.php +++ b/packages/sonata-import-bundle/Tests/ColumnFactoryTest.php @@ -31,13 +31,18 @@ protected function setUp(): void public function testGenerateColumnsIdentifier(): void { - $columns = $this->columnFactory - ->generateColumns( - Import::class, + $import = (new Import()) + ->setEntityClass(Import::class); + + $this->columnFactory + ->buildColumns( + $import, ['id'], [[12]] ); + $columns = $import->getColumns()->toArray(); + static::assertCount(1, $columns); $column = $columns[0]; @@ -53,13 +58,18 @@ public function testGenerateColumnsIdentifier(): void public function testGenerateColumnsDate(): void { - $columns = $this->columnFactory - ->generateColumns( - Import::class, + $import = (new Import()) + ->setEntityClass(Import::class); + + $this->columnFactory + ->buildColumns( + $import, ['createdAt'], ['2018-10-10'] ); + $columns = $import->getColumns()->toArray(); + static::assertCount(1, $columns); $column = $columns[0]; diff --git a/symfony.lock b/symfony.lock index 44bccb478..576a29d2b 100644 --- a/symfony.lock +++ b/symfony.lock @@ -32,18 +32,6 @@ "dasprid/enum": { "version": "1.0.3" }, - "doctrine/annotations": { - "version": "1.13", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "1.0", - "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457" - }, - "files": [ - "config/routes/annotations.yaml" - ] - }, "doctrine/cache": { "version": "2.1.1" }, @@ -183,6 +171,9 @@ "ref": "384cec52df45f3bfd46a09930d6960a58872b268" } }, + "knplabs/doctrine-behaviors": { + "version": "2.6.2" + }, "knplabs/knp-menu": { "version": "v3.2.0" },