diff --git a/composer.json b/composer.json index 75d822c..cb1d40a 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ ], "require": { "php": "^5.4.0|^7.0.0", - "arachne/di-helpers": "^0.4.0|^0.5.0", + "arachne/service-collections": "^0.1.0", "kdyby/doctrine": "^3.0.0", "nette/di": "^2.3.0" }, @@ -25,11 +25,9 @@ "require-dev": { "php": "^5.5.0|^7.0.0", "arachne/codeception": "^0.7.3", - "arachne/entity-loader": "^0.8.3|^0.9.0", + "arachne/entity-loader": "^0.10.0", "codeception/codeception": "~2.2.0", - "kdyby/console": "^2.4.0", - "nette/di": "~2.3.0|^2.4.3@dev", - "symfony/event-dispatcher": "^2.8.0" + "kdyby/console": "^2.4.0" }, "autoload": { "psr-4": { diff --git a/src/DI/DoctrineExtension.php b/src/DI/DoctrineExtension.php index f53b2e5..06c2db7 100644 --- a/src/DI/DoctrineExtension.php +++ b/src/DI/DoctrineExtension.php @@ -10,13 +10,14 @@ namespace Arachne\Doctrine\DI; -use Arachne\DIHelpers\CompilerExtension; use Arachne\EntityLoader\DI\EntityLoaderExtension; use Arachne\EventManager\DI\EventManagerExtension; use Arachne\Forms\DI\FormsExtension; +use Arachne\ServiceCollections\DI\ServiceCollectionsExtension; use Kdyby\DoctrineCache\DI\Helpers; use Kdyby\Events\DI\EventsExtension; use Kdyby\Validator\DI\ValidatorExtension; +use Nette\DI\CompilerExtension; use Nette\Utils\AssertionException; use Nette\Utils\Validators; @@ -46,17 +47,43 @@ public function loadConfiguration() $builder = $this->getContainerBuilder(); if ($this->getExtension('Arachne\EntityLoader\DI\EntityLoaderExtension', false)) { - $builder->addDefinition($this->prefix('entityLoader.filterInResolver')) - ->setClass('Arachne\Doctrine\EntityLoader\FilterInResolver') - ->setAutowired(false); - - $builder->addDefinition($this->prefix('entityLoader.filterOutResolver')) - ->setClass('Arachne\Doctrine\EntityLoader\FilterOutResolver') - ->setAutowired(false); - - $extension = $this->getExtension('Arachne\DIHelpers\DI\ResolversExtension'); - $extension->override(EntityLoaderExtension::TAG_FILTER_IN, $this->prefix('entityLoader.filterInResolver')); - $extension->override(EntityLoaderExtension::TAG_FILTER_OUT, $this->prefix('entityLoader.filterOutResolver')); + $serviceCollectionsExtension = $this->getExtension('Arachne\ServiceCollections\DI\ServiceCollectionsExtension'); + $serviceCollectionsExtension->overrideCollection( + ServiceCollectionsExtension::TYPE_RESOLVER, + EntityLoaderExtension::TAG_FILTER_IN, + function ($originalService) use ($builder) { + $service = $this->prefix('entityLoader.filterInResolver'); + + $builder->addDefinition($service) + ->setClass('Arachne\Doctrine\EntityLoader\FilterInResolver') + ->setArguments( + [ + 'resolver' => '@'.$originalService, + ] + ) + ->setAutowired(false); + + return $service; + } + ); + $serviceCollectionsExtension->overrideCollection( + ServiceCollectionsExtension::TYPE_RESOLVER, + EntityLoaderExtension::TAG_FILTER_OUT, + function ($originalService) use ($builder) { + $service = $this->prefix('entityLoader.filterOutResolver'); + + $builder->addDefinition($service) + ->setClass('Arachne\Doctrine\EntityLoader\FilterOutResolver') + ->setArguments( + [ + 'resolver' => '@'.$originalService, + ] + ) + ->setAutowired(false); + + return $service; + } + ); } if ($this->getExtension('Kdyby\Validator\DI\ValidatorExtension', false)) { @@ -124,26 +151,26 @@ public function loadConfiguration() } } - public function beforeCompile() + /** + * @param string $class + * @param bool $need + * + * @return CompilerExtension|null + */ + private function getExtension($class, $need = true) { - $builder = $this->getContainerBuilder(); + $extensions = $this->compiler->getExtensions($class); - if ($this->getExtension('Arachne\EntityLoader\DI\EntityLoaderExtension', false)) { - $extension = $this->getExtension('Arachne\DIHelpers\DI\ResolversExtension', false); - - $builder->getDefinition($this->prefix('entityLoader.filterInResolver')) - ->setArguments( - [ - 'resolver' => '@'.$extension->get(EntityLoaderExtension::TAG_FILTER_IN, false), - ] - ); + if (!$extensions) { + if (!$need) { + return null; + } - $builder->getDefinition($this->prefix('entityLoader.filterOutResolver')) - ->setArguments( - [ - 'resolver' => '@'.$extension->get(EntityLoaderExtension::TAG_FILTER_OUT, false), - ] - ); + throw new AssertionException( + sprintf('Extension "%s" requires "%s" to be installed.', get_class($this), $class) + ); } + + return reset($extensions); } } diff --git a/src/EntityLoader/FilterInResolver.php b/src/EntityLoader/FilterInResolver.php index 8995c48..a27755b 100644 --- a/src/EntityLoader/FilterInResolver.php +++ b/src/EntityLoader/FilterInResolver.php @@ -10,16 +10,15 @@ namespace Arachne\Doctrine\EntityLoader; -use Arachne\DIHelpers\ResolverInterface; use Doctrine\Common\Persistence\ManagerRegistry; /** * @author Jáchym Toušek */ -class FilterInResolver implements ResolverInterface +class FilterInResolver { /** - * @var ResolverInterface + * @var callable */ private $resolver; @@ -33,7 +32,7 @@ class FilterInResolver implements ResolverInterface */ private $filters; - public function __construct(ResolverInterface $resolver, ManagerRegistry $managerRegistry) + public function __construct(callable $resolver, ManagerRegistry $managerRegistry) { $this->resolver = $resolver; $this->managerRegistry = $managerRegistry; @@ -44,9 +43,10 @@ public function __construct(ResolverInterface $resolver, ManagerRegistry $manage * * @return FilterIn|null */ - public function resolve($name) + public function __invoke($name) { - return $this->resolver->resolve($name) ?: (isset($this->filters[$name]) ? $this->filters[$name] : $this->filters[$name] = $this->create($name)); + return call_user_func($this->resolver, $name) + ?: (isset($this->filters[$name]) ? $this->filters[$name] : $this->filters[$name] = $this->create($name)); } /** diff --git a/src/EntityLoader/FilterOutResolver.php b/src/EntityLoader/FilterOutResolver.php index 9773fc4..d962081 100644 --- a/src/EntityLoader/FilterOutResolver.php +++ b/src/EntityLoader/FilterOutResolver.php @@ -10,16 +10,15 @@ namespace Arachne\Doctrine\EntityLoader; -use Arachne\DIHelpers\ResolverInterface; use Doctrine\Common\Persistence\ManagerRegistry; /** * @author Jáchym Toušek */ -class FilterOutResolver implements ResolverInterface +class FilterOutResolver { /** - * @var ResolverInterface + * @var callable */ private $resolver; @@ -33,7 +32,7 @@ class FilterOutResolver implements ResolverInterface */ private $filters; - public function __construct(ResolverInterface $resolver, ManagerRegistry $managerRegistry) + public function __construct(callable $resolver, ManagerRegistry $managerRegistry) { $this->resolver = $resolver; $this->managerRegistry = $managerRegistry; @@ -44,9 +43,10 @@ public function __construct(ResolverInterface $resolver, ManagerRegistry $manage * * @return FilterOut|null */ - public function resolve($name) + public function __invoke($name) { - return $this->resolver->resolve($name) ?: (isset($this->filters[$name]) ? $this->filters[$name] : $this->filters[$name] = $this->create($name)); + return call_user_func($this->resolver, $name) + ?: (isset($this->filters[$name]) ? $this->filters[$name] : $this->filters[$name] = $this->create($name)); } /** diff --git a/tests/functional/config/config.neon b/tests/functional/config/config.neon index 1eb6db3..8c6a119 100644 --- a/tests/functional/config/config.neon +++ b/tests/functional/config/config.neon @@ -1,7 +1,7 @@ extensions: - arachne.dihelpers.resolvers: Arachne\DIHelpers\DI\ResolversExtension - arachne.entityloader: Arachne\EntityLoader\DI\EntityLoaderExtension + arachne.servicecollections: Arachne\ServiceCollections\DI\ServiceCollectionsExtension arachne.doctrine: Arachne\Doctrine\DI\DoctrineExtension + arachne.entityloader: Arachne\EntityLoader\DI\EntityLoaderExtension kdyby.annotations: Kdyby\Annotations\DI\AnnotationsExtension kdyby.console: Kdyby\Console\DI\ConsoleExtension kdyby.events: Kdyby\Events\DI\EventsExtension