diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e0067e0..21abe3b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,18 +29,12 @@ jobs: - "yes" - "no" symfony-require: - - "^3.0" - - "^4.0" - "^5.0" - "^6.0" - "^7.0" exclude: - # Symfony 3-6 would install jms/serializer-bundle:4 + # Symfony 5-6 would install jms/serializer-bundle:4 # which is not usable without annotations - - symfony-require: "^3.0" - remove-annotations: "yes" - - symfony-require: "^4.0" - remove-annotations: "yes" - symfony-require: "^5.0" remove-annotations: "yes" - symfony-require: "^6.0" diff --git a/DependencyInjection/BazingaHateoasExtension.php b/DependencyInjection/BazingaHateoasExtension.php index d857e4a..aca1530 100644 --- a/DependencyInjection/BazingaHateoasExtension.php +++ b/DependencyInjection/BazingaHateoasExtension.php @@ -13,7 +13,7 @@ use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; +use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\HttpKernel\DependencyInjection\Extension; @@ -22,14 +22,14 @@ class BazingaHateoasExtension extends Extension public function load(array $configs, ContainerBuilder $container): void { $config = $this->processConfiguration(new Configuration(), $configs); - $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); + $loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); foreach (['serializer', 'configuration', 'generator', 'helper', 'twig'] as $file) { if ('twig' === $file && false === $config['twig_extension']['enabled']) { continue; } - $loader->load($file . '.xml'); + $loader->load($file . '.php'); } // Based on JMSSerializerBundle diff --git a/Resources/config/configuration.php b/Resources/config/configuration.php new file mode 100644 index 0000000..a8af81f --- /dev/null +++ b/Resources/config/configuration.php @@ -0,0 +1,120 @@ +services(); + $parameters = $container->parameters(); + + $services->alias('hateoas.configuration.provider', 'hateoas.configuration.provider.chain') + ->public(); + + $services->set('hateoas.configuration.provider.chain', \Hateoas\Configuration\Provider\ChainProvider::class) + ->private() + ->args([[]]); + + $services->set('hateoas.configuration.provider.function', \Hateoas\Configuration\Provider\FunctionProvider::class) + ->private() + ->tag('hateoas.relation_provider'); + + $services->set('hateoas.configuration.provider.static_method', \Hateoas\Configuration\Provider\StaticMethodProvider::class) + ->private() + ->tag('hateoas.relation_provider'); + + $services->set('hateoas.configuration.provider.expression', \Hateoas\Configuration\Provider\ExpressionEvaluatorProvider::class) + ->private() + ->args([service('jms_serializer.expression_evaluator')]) + ->tag('hateoas.relation_provider'); + + $services->set('hateoas.configuration.metadata.yaml_driver', \Hateoas\Configuration\Metadata\Driver\YamlDriver::class) + ->private() + ->args([ + service('jms_serializer.metadata.file_locator'), + service('jms_serializer.expression_evaluator'), + service('hateoas.configuration.provider'), + service('jms_serializer.type_parser')->nullOnInvalid(), + ]); + + $services->set('hateoas.configuration.metadata.xml_driver', \Hateoas\Configuration\Metadata\Driver\XmlDriver::class) + ->private() + ->args([ + service('jms_serializer.metadata.file_locator'), + service('jms_serializer.expression_evaluator'), + service('hateoas.configuration.provider'), + service('jms_serializer.type_parser')->nullOnInvalid(), + ]); + + // The `Hateoas\Configuration\Metadata\Driver\AnnotationDriver` class and its corresponding `hateoas.configuration.metadata.annotation_driver` service are deprecated in favor of the `hateoas.configuration.metadata.attribute_driver` service + $services->set('hateoas.configuration.metadata.annotation_driver', \Hateoas\Configuration\Metadata\Driver\AnnotationDriver::class) + ->private() + ->args([ + service('hateoas.configuration.metadata.annotation_reader'), + service('jms_serializer.expression_evaluator'), + service('hateoas.configuration.provider'), + service('jms_serializer.type_parser')->nullOnInvalid(), + ]); + + $services->set('hateoas.configuration.metadata.attribute_driver', \Hateoas\Configuration\Metadata\Driver\AttributeDriver::class) + ->private() + ->args([ + service('jms_serializer.expression_evaluator'), + service('hateoas.configuration.provider'), + service('jms_serializer.type_parser')->nullOnInvalid(), + ]); + + // The `hateoas.configuration.metadata.annotation_or_attribute_driver` is necessary to provide the extension feature to the `hateoas.configuration.metadata.attribute_driver` service + $services->set('hateoas.configuration.metadata.annotation_or_attribute_driver', \Metadata\Driver\DriverChain::class) + ->private() + ->args([ + [ + service('hateoas.configuration.metadata.attribute_driver')->ignoreOnInvalid(), + service('hateoas.configuration.metadata.annotation_driver')->ignoreOnInvalid(), + ], + ]); + + $services->set('hateoas.configuration.metadata.extension_driver', \Hateoas\Configuration\Metadata\Driver\ExtensionDriver::class) + ->private() + ->args([service('hateoas.configuration.metadata.annotation_or_attribute_driver')]); + + $services->set('hateoas.configuration.metadata.chain_driver', \Metadata\Driver\DriverChain::class) + ->private() + ->args([ + [ + service('hateoas.configuration.metadata.yaml_driver'), + service('hateoas.configuration.metadata.xml_driver'), + service('hateoas.configuration.metadata.extension_driver'), + ], + ]); + + $services->alias('hateoas.configuration.metadata_driver', 'hateoas.configuration.metadata.chain_driver') + ->public(); + + $services->set('hateoas.configuration.metadata.lazy_loading_driver', \Metadata\Driver\LazyLoadingDriver::class) + ->private() + ->args([ + service('service_container'), + 'hateoas.configuration.metadata_driver', + ]); + + // Metadata Factory + $services->set('hateoas.configuration.metadata.cache.file_cache', \Metadata\Cache\FileCache::class) + ->private() + ->args([ + '', // Directory + ]); + + $services->set('hateoas.configuration.metadata.annotation_reader', \Doctrine\Common\Annotations\AnnotationReader::class) + ->private(); + + $services->alias('hateoas.configuration.metadata.cache', 'hateoas.configuration.metadata.cache.file_cache') + ->private(); + + $services->set('hateoas.configuration.metadata_factory', \Metadata\MetadataFactory::class) + ->private() + ->args([ + service('hateoas.configuration.metadata.lazy_loading_driver'), + \Metadata\ClassHierarchyMetadata::class, + '%kernel.debug%', + ]) + ->call('setCache', [service('hateoas.configuration.metadata.cache')->ignoreOnInvalid()]); +}; diff --git a/Resources/config/configuration.xml b/Resources/config/configuration.xml deleted file mode 100644 index dd1b825..0000000 --- a/Resources/config/configuration.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - hateoas.configuration.metadata_driver - - - - - - - - - - - - - - Metadata\ClassHierarchyMetadata - %kernel.debug% - - - - - - diff --git a/Resources/config/generator.php b/Resources/config/generator.php new file mode 100644 index 0000000..79b36ee --- /dev/null +++ b/Resources/config/generator.php @@ -0,0 +1,15 @@ +services(); + $parameters = $container->parameters(); + + $services->set('hateoas.generator.registry', \Hateoas\UrlGenerator\UrlGeneratorRegistry::class) + ->public() + ->args([service('hateoas.generator.symfony')]); + + $services->set('hateoas.generator.symfony', \Hateoas\UrlGenerator\SymfonyUrlGenerator::class) + ->args([service('router')]); +}; diff --git a/Resources/config/generator.xml b/Resources/config/generator.xml deleted file mode 100644 index aedb8c2..0000000 --- a/Resources/config/generator.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/Resources/config/helper.php b/Resources/config/helper.php new file mode 100644 index 0000000..6e4b409 --- /dev/null +++ b/Resources/config/helper.php @@ -0,0 +1,19 @@ +services(); + $parameters = $container->parameters(); + + $services->set('hateoas.helper.link', \Hateoas\Helper\LinkHelper::class) + ->public() + ->args([ + service('hateoas.link_factory'), + service('hateoas.configuration.metadata_factory'), + ]); + + $services->set('hateoas.expression.link_expression_function', \Bazinga\Bundle\HateoasBundle\Expression\LinkExpressionFunction::class) + ->private() + ->tag('jms.expression.function_provider'); +}; diff --git a/Resources/config/helper.xml b/Resources/config/helper.xml deleted file mode 100644 index 10f7edb..0000000 --- a/Resources/config/helper.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Resources/config/serializer.php b/Resources/config/serializer.php new file mode 100644 index 0000000..225817f --- /dev/null +++ b/Resources/config/serializer.php @@ -0,0 +1,73 @@ +services(); + $parameters = $container->parameters(); + + // Factories + $services->set('hateoas.link_factory', \Hateoas\Factory\LinkFactory::class) + ->private() + ->args([ + service('hateoas.generator.registry'), + service('jms_serializer.expression_evaluator'), + ]); + + $services->set('hateoas.links_factory', \Hateoas\Factory\LinksFactory::class) + ->private() + ->args([ + service('hateoas.configuration.metadata_factory'), + service('hateoas.link_factory'), + service('hateoas.serializer.exclusion_manager'), + ]); + + $services->set('hateoas.embeds_factory', \Hateoas\Factory\EmbeddedsFactory::class) + ->private() + ->args([ + service('hateoas.configuration.metadata_factory'), + service('jms_serializer.expression_evaluator'), + service('hateoas.serializer.exclusion_manager'), + ]); + + // Serializers & Handlers + $services->set('hateoas.serializer.xml', \Hateoas\Serializer\XmlSerializer::class) + ->private(); + + $services->set('hateoas.serializer.json_hal', \Hateoas\Serializer\JsonHalSerializer::class) + ->private(); + + $services->set('hateoas.serializer.exclusion.expression_language_strategy', \JMS\Serializer\Exclusion\ExpressionLanguageExclusionStrategy::class) + ->private() + ->args([service('jms_serializer.expression_evaluator')]); + + $services->set('hateoas.serializer.exclusion_manager', \Hateoas\Serializer\ExclusionManager::class) + ->args([service('hateoas.serializer.exclusion.expression_language_strategy')]); + + // Subscribers + $services->set('hateoas.event_listener.xml', \Hateoas\Serializer\AddRelationsListener::class) + ->args([ + '', // xml serializer + service('hateoas.links_factory'), + service('hateoas.embeds_factory'), + service('hateoas.inline_deferrer.embeds'), + service('hateoas.inline_deferrer.links'), + ]) + ->tag('jms_serializer.event_listener', ['event' => 'serializer.post_serialize', 'format' => 'xml', 'method' => 'onPostSerialize']); + + $services->set('hateoas.event_listener.json', \Hateoas\Serializer\AddRelationsListener::class) + ->args([ + '', // json serializer + service('hateoas.links_factory'), + service('hateoas.embeds_factory'), + service('hateoas.inline_deferrer.embeds'), + service('hateoas.inline_deferrer.links'), + ]) + ->tag('jms_serializer.event_listener', ['event' => 'serializer.post_serialize', 'format' => 'json', 'method' => 'onPostSerialize']); + + $services->set('hateoas.inline_deferrer.embeds', \Hateoas\Serializer\Metadata\InlineDeferrer::class) + ->private(); + + $services->set('hateoas.inline_deferrer.links', \Hateoas\Serializer\Metadata\InlineDeferrer::class) + ->private(); +}; diff --git a/Resources/config/serializer.xml b/Resources/config/serializer.xml deleted file mode 100644 index 9fabf18..0000000 --- a/Resources/config/serializer.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Resources/config/twig.php b/Resources/config/twig.php new file mode 100644 index 0000000..a9131fd --- /dev/null +++ b/Resources/config/twig.php @@ -0,0 +1,12 @@ +services(); + $parameters = $container->parameters(); + + $services->set('hateoas.twig.link', \Hateoas\Twig\Extension\LinkExtension::class) + ->args([service('hateoas.helper.link')]) + ->tag('twig.extension'); +}; diff --git a/Resources/config/twig.xml b/Resources/config/twig.xml deleted file mode 100644 index 1ae0061..0000000 --- a/Resources/config/twig.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - diff --git a/composer.json b/composer.json index 58d302d..3c35108 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,7 @@ "require": { "php": "^8.1", "jms/serializer-bundle": "^3.10 || ^4.2 || ^5.4", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", "symfony/expression-language": "~3.0 || ~4.0 || ~5.0 || ~6.0 || ~7.0", "symfony/framework-bundle": "~3.0 || ~4.0 || ~5.0 || ~6.0 || ~7.0", "willdurand/hateoas": "^3.12@beta"