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"