From b490e09f934fbf565b159bd6c00b5b11fd5ff10c Mon Sep 17 00:00:00 2001 From: WouterJ Date: Sat, 31 Oct 2015 12:56:52 +0100 Subject: [PATCH 1/2] Add Puli Discovery integration --- CmfResourceBundle.php | 3 + DependencyInjection/CmfResourceExtension.php | 19 +++++- .../Compiler/DiscoveryPass.php | 60 +++++++++++++++++++ DependencyInjection/Configuration.php | 38 +++++++++++- Resources/config/discovery.xml | 26 ++++++++ Resources/config/resource.xml | 2 + 6 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 DependencyInjection/Compiler/DiscoveryPass.php create mode 100644 Resources/config/discovery.xml diff --git a/CmfResourceBundle.php b/CmfResourceBundle.php index 4317426..533f89a 100644 --- a/CmfResourceBundle.php +++ b/CmfResourceBundle.php @@ -14,6 +14,7 @@ use Symfony\Component\HttpKernel\Bundle\Bundle; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Cmf\Bundle\ResourceBundle\DependencyInjection\Compiler\RegistryPass; +use Symfony\Cmf\Bundle\ResourceBundle\DependencyInjection\Compiler\DiscoveryPass; use Symfony\Cmf\Bundle\ResourceBundle\DependencyInjection\Compiler\CompositeRepositoryPass; class CmfResourceBundle extends Bundle @@ -22,6 +23,8 @@ public function build(ContainerBuilder $container) { $container->addCompilerPass(new RegistryPass()); $container->addCompilerPass(new CompositeRepositoryPass()); + $container->addCompilerPass(new DiscoveryPass()); + parent::build($container); } } diff --git a/DependencyInjection/CmfResourceExtension.php b/DependencyInjection/CmfResourceExtension.php index d3f7464..8b269ec 100644 --- a/DependencyInjection/CmfResourceExtension.php +++ b/DependencyInjection/CmfResourceExtension.php @@ -36,6 +36,10 @@ public function load(array $configs, ContainerBuilder $container) $config = $processor->processConfiguration($configuration, $configs); $this->loadRepositories($config['repositories'], $container); + + if ($this->isConfigEnabled($container, $config['discovery'])) { + $this->loadDiscovery($config['discovery'], $container, $loader); + } } private function loadRepositories(array $repositories, ContainerBuilder $container) @@ -64,6 +68,19 @@ private function loadRepositories(array $repositories, ContainerBuilder $contain $container->setAlias('cmf_resource.registry', 'cmf_resource.registry.container'); } + private function loadDiscovery(array $discovery, ContainerBuilder $container, XmlFileLoader $loader) + { + if (!class_exists('Puli\Discovery\Api\Discovery')) { + throw new InvalidConfigurationException( + 'The puli/discovery package must be installed when enabling discovery. The package is not found.' + ); + } + + $loader->load('discovery.xml'); + + $container->setParameter('cmf_resource.discovery.bindings', $discovery['bindings']); + } + private function createDoctrinePhpcrOdmRepository(array $options, $alias) { if (!isset($options['basepath'])) { @@ -104,7 +121,7 @@ private function createCompositeRepository(array $options, $alias) throw new InvalidConfigurationException('The composite repository type requires a "mounts" option to be set.'); } - $definition = new Definition('Puli\Repository\CompositeRepository'); + $definition = new Definition('Symfony\Cmf\Component\Resource\Repository\CompositeRepository'); foreach ($options['mounts'] as $mount) { if (!isset($mount['mountpoint']) || !isset($mount['repository'])) { diff --git a/DependencyInjection/Compiler/DiscoveryPass.php b/DependencyInjection/Compiler/DiscoveryPass.php new file mode 100644 index 0000000..a12eda6 --- /dev/null +++ b/DependencyInjection/Compiler/DiscoveryPass.php @@ -0,0 +1,60 @@ + + */ +class DiscoveryPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition('cmf_resource.discovery')) { + return; + } + + $discovery = $container->findDefinition('cmf_resource.discovery'); + + $this->registerBindingTypes($container, $discovery); + $this->registerBindings($container, $discovery); + } + + private function registerBindings(ContainerBuilder $container, Definition $discovery) + { + if (!$container->hasParameter('cmf_resource.discovery.bindings')) { + return; + } + + $bindings = $container->getParameter('cmf_resource.discovery.bindings'); + foreach ($bindings as $binding) { + $discovery->addMethodCall('addBinding', array( + new Definition( + 'Puli\Discovery\Binding\ResourceBinding', + array($binding['path'], $binding['type']) + ) + )); + } + } + + private function registerBindingTypes(ContainerBuilder $container, Definition $discovery) + { + $types = $container->findTaggedServiceIds('cmf_resource.binding_type'); + foreach ($types as $id => $tags) { + $discovery->addMethodCall('addBindingType', array(new Reference($id))); + } + } +} diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index f5e1350..05e595d 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -12,6 +12,7 @@ namespace Symfony\Cmf\Bundle\ResourceBundle\DependencyInjection; use Symfony\Component\Config\Definition\ConfigurationInterface; +use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; class Configuration implements ConfigurationInterface @@ -24,7 +25,17 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); - $treeBuilder->root('cmf_resource') + $root = $treeBuilder->root('cmf_resource'); + + $this->addRepositoriesSection($root); + $this->addDiscoverySection($root); + + return $treeBuilder; + } + + public function addRepositoriesSection(ArrayNodeDefinition $root) + { + $root ->fixXmlConfig('repository', 'repositories') ->children() ->arrayNode('repositories') @@ -89,7 +100,30 @@ public function getConfigTreeBuilder() ->end() ->end() // repositories ->end(); + } - return $treeBuilder; + public function addDiscoverySection(ArrayNodeDefinition $root) + { + $root + ->children() + ->arrayNode('discovery') + ->canBeEnabled() + ->fixXmlConfig('type') + ->fixXmlConfig('binding') + ->children() + ->arrayNode('types') + ->prototype('scalar')->end() + ->end() // types + ->arrayNode('bindings') + ->prototype('array') + ->children() + ->scalarNode('path')->isRequired()->end() + ->scalarNode('type')->isRequired()->end() + ->end() + ->end() + ->end() // bindings + ->end() + ->end() // discovery + ->end(); } } diff --git a/Resources/config/discovery.xml b/Resources/config/discovery.xml new file mode 100644 index 0000000..a9702cc --- /dev/null +++ b/Resources/config/discovery.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/config/resource.xml b/Resources/config/resource.xml index 70e1afb..936044e 100644 --- a/Resources/config/resource.xml +++ b/Resources/config/resource.xml @@ -18,5 +18,7 @@ + + From df34f284ef43abdbce8529da1f808ff826a6259f Mon Sep 17 00:00:00 2001 From: WouterJ Date: Sat, 31 Oct 2015 13:51:51 +0100 Subject: [PATCH 2/2] Suggest puli/discovery --- composer.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 1c5cf23..acc4e24 100644 --- a/composer.json +++ b/composer.json @@ -19,11 +19,13 @@ "symfony-cmf/testing": "^1.3", "matthiasnoback/symfony-dependency-injection-test": "0.*", "matthiasnoback/symfony-config-test": "0.*", - "doctrine/phpcr-odm": "^1.2" + "doctrine/phpcr-odm": "^1.2", + "puli/discovery": "^1.0.0-beta8" }, "suggest": { "doctrine/phpcr-odm": "To enable support for the PHPCR ODM documents (^1.2)", - "doctrine/phpcr-bundle": "To enable support for the PHPCR ODM documents" + "doctrine/phpcr-bundle": "To enable support for the PHPCR ODM documents", + "puli/discovery": "To integrate Puli Discovery (^1.0.0-beta8)" }, "autoload": { "psr-4": {