From 94daf888071c60fe28463f0b190c33152f088c7e Mon Sep 17 00:00:00 2001 From: TomasVotruba Date: Wed, 19 Jul 2017 19:02:00 +0200 Subject: [PATCH] decouple ServiceFromKernelResolver --- .../Kernel/ServiceFromKernelResolver.php | 29 +++++++++ .../NamedServicesToConstructorNodeVisitor.php | 39 ++++------- .../GetterToPropertyNodeVisitor.php | 64 ++++++++----------- 3 files changed, 66 insertions(+), 66 deletions(-) create mode 100644 src/Builder/Kernel/ServiceFromKernelResolver.php diff --git a/src/Builder/Kernel/ServiceFromKernelResolver.php b/src/Builder/Kernel/ServiceFromKernelResolver.php new file mode 100644 index 00000000000..4933b9661c9 --- /dev/null +++ b/src/Builder/Kernel/ServiceFromKernelResolver.php @@ -0,0 +1,29 @@ +boot(); + + // @todo: cache + // @todo: initialize without creating cache or log directory + // @todo: call only loadBundles() and initializeContainer() methods + + $container = $kernel->getContainer(); + if (! $container->has($serviceName)) { + // service name could not be found + return null; + } + + $service = $container->get($serviceName); + + return get_class($service); + } +} diff --git a/src/NodeVisitor/DependencyInjection/NamedServicesToConstructorNodeVisitor.php b/src/NodeVisitor/DependencyInjection/NamedServicesToConstructorNodeVisitor.php index e3bff4c616c..094840a7ac2 100644 --- a/src/NodeVisitor/DependencyInjection/NamedServicesToConstructorNodeVisitor.php +++ b/src/NodeVisitor/DependencyInjection/NamedServicesToConstructorNodeVisitor.php @@ -13,11 +13,10 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\NodeVisitorAbstract; use Rector\Builder\ConstructorMethodBuilder; +use Rector\Builder\Kernel\ServiceFromKernelResolver; use Rector\Builder\Naming\NameResolver; use Rector\Builder\PropertyBuilder; use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\HttpKernel\Kernel; final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract { @@ -36,14 +35,21 @@ final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract */ private $nameResolver; + /** + * @var ServiceFromKernelResolver + */ + private $serviceFromKernelResolver; + public function __construct( ConstructorMethodBuilder $constructorMethodBuilder, PropertyBuilder $propertyBuilder, - NameResolver $nameResolver + NameResolver $nameResolver, + ServiceFromKernelResolver $serviceFromKernelResolver ) { $this->constructorMethodBuilder = $constructorMethodBuilder; $this->propertyBuilder = $propertyBuilder; $this->nameResolver = $nameResolver; + $this->serviceFromKernelResolver = $serviceFromKernelResolver; } private function isCandidate(Node $node): bool @@ -103,21 +109,6 @@ final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract // } } - /** - * @todo extract to helper service, LocalKernelProvider::get...() - */ - private function getContainerFromKernelClass(): ContainerInterface - { - /** @var Kernel $kernel */ - $kernel = new LocalKernel('dev', true); - $kernel->boot(); - - // @todo: initialize without creating cache or log directory - // @todo: call only loadBundles() and initializeContainer() methods - - return $kernel->getContainer(); - } - /** * Accept only "$this->get('string')" statements. */ @@ -155,15 +146,9 @@ final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract $argument = $methodCallNode->args[0]->value; $serviceName = $argument->value; - $container = $this->getContainerFromKernelClass(); - if (! $container->has($serviceName)) { - // service name could not be found - return null; - } - - $service = $container->get($serviceName); - - return get_class($service); + return $this->serviceFromKernelResolver->resolveServiceClassByNameFromKernel( + $serviceName, LocalKernel::class + ); } private function processMethodCallNode(Class_ $classNode, MethodCall $methodCall): ?PropertyFetch diff --git a/src/NodeVisitor/DependencyInjection/NamedServicesToConstrutor/GetterToPropertyNodeVisitor.php b/src/NodeVisitor/DependencyInjection/NamedServicesToConstrutor/GetterToPropertyNodeVisitor.php index 36dfd38249a..058299ba1fa 100644 --- a/src/NodeVisitor/DependencyInjection/NamedServicesToConstrutor/GetterToPropertyNodeVisitor.php +++ b/src/NodeVisitor/DependencyInjection/NamedServicesToConstrutor/GetterToPropertyNodeVisitor.php @@ -11,6 +11,7 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Class_; use PhpParser\NodeVisitorAbstract; +use Rector\Builder\Kernel\ServiceFromKernelResolver; use Rector\Builder\Naming\NameResolver; use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -25,6 +26,22 @@ use Symfony\Component\HttpKernel\Kernel; */ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract { + /** + * @var NameResolver + */ + private $nameResolver; + + /** + * @var ServiceFromKernelResolver + */ + private $serviceFromKernelResolver; + + public function __construct(NameResolver $nameResolver, ServiceFromKernelResolver $serviceFromKernelResolver) + { + $this->nameResolver = $nameResolver; + $this->serviceFromKernelResolver = $serviceFromKernelResolver; + } + /** * Return value semantics: * * null @@ -48,13 +65,13 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract } /** - * @var NameResolver + * @param Assign|MethodCall $assignOrMethodCallNode */ - private $nameResolver; - - public function __construct(NameResolver $nameResolver) + public function reconstruct(Node $assignOrMethodCallNode): void { - $this->nameResolver = $nameResolver; + if ($assignOrMethodCallNode instanceof Assign) { + $this->processAssignment($assignOrMethodCallNode); + } } private function isCandidate(Node $node): bool @@ -79,16 +96,6 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract return false; } - /** - * @param Assign|MethodCall $assignOrMethodCallNode - */ - public function reconstruct(Node $assignOrMethodCallNode): void - { - if ($assignOrMethodCallNode instanceof Assign) { - $this->processAssignment($assignOrMethodCallNode); - } - } - private function processAssignment(Assign $assignNode): void { $refactoredMethodCall = $this->processMethodCallNode($assignNode->expr); @@ -97,21 +104,6 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract } } - /** - * @todo extract to helper service, LocalKernelProvider::get...() - */ - private function getContainerFromKernelClass(): ContainerInterface - { - /** @var Kernel $kernel */ - $kernel = new LocalKernel('dev', true); - $kernel->boot(); - - // @todo: initialize without creating cache or log directory - // @todo: call only loadBundles() and initializeContainer() methods - - return $kernel->getContainer(); - } - /** * Is "$this->get('string')" statements? */ @@ -141,15 +133,9 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract $argument = $methodCallNode->args[0]->value; $serviceName = $argument->value; - $container = $this->getContainerFromKernelClass(); - if (! $container->has($serviceName)) { - // service name could not be found - return null; - } - - $service = $container->get($serviceName); - - return get_class($service); + return $this->serviceFromKernelResolver->resolveServiceClassByNameFromKernel( + $serviceName, LocalKernel::class + ); } private function processMethodCallNode(MethodCall $methodCall): ?PropertyFetch