decouple ServiceFromKernelResolver

This commit is contained in:
TomasVotruba 2017-07-19 19:02:00 +02:00
parent 222557c122
commit 94daf88807
3 changed files with 66 additions and 66 deletions

View File

@ -0,0 +1,29 @@
<?php declare(strict_types=1);
namespace Rector\Builder\Kernel;
use Symfony\Component\HttpKernel\Kernel;
final class ServiceFromKernelResolver
{
public function resolveServiceClassByNameFromKernel(string $serviceName, string $kernelClass): ?string
{
/** @var Kernel $kernel */
$kernel = new $kernelClass('dev', true);
$kernel->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);
}
}

View File

@ -13,11 +13,10 @@ use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\NodeVisitorAbstract; use PhpParser\NodeVisitorAbstract;
use Rector\Builder\ConstructorMethodBuilder; use Rector\Builder\ConstructorMethodBuilder;
use Rector\Builder\Kernel\ServiceFromKernelResolver;
use Rector\Builder\Naming\NameResolver; use Rector\Builder\Naming\NameResolver;
use Rector\Builder\PropertyBuilder; use Rector\Builder\PropertyBuilder;
use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel; use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Kernel;
final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract
{ {
@ -36,14 +35,21 @@ final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract
*/ */
private $nameResolver; private $nameResolver;
/**
* @var ServiceFromKernelResolver
*/
private $serviceFromKernelResolver;
public function __construct( public function __construct(
ConstructorMethodBuilder $constructorMethodBuilder, ConstructorMethodBuilder $constructorMethodBuilder,
PropertyBuilder $propertyBuilder, PropertyBuilder $propertyBuilder,
NameResolver $nameResolver NameResolver $nameResolver,
ServiceFromKernelResolver $serviceFromKernelResolver
) { ) {
$this->constructorMethodBuilder = $constructorMethodBuilder; $this->constructorMethodBuilder = $constructorMethodBuilder;
$this->propertyBuilder = $propertyBuilder; $this->propertyBuilder = $propertyBuilder;
$this->nameResolver = $nameResolver; $this->nameResolver = $nameResolver;
$this->serviceFromKernelResolver = $serviceFromKernelResolver;
} }
private function isCandidate(Node $node): bool 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. * Accept only "$this->get('string')" statements.
*/ */
@ -155,15 +146,9 @@ final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract
$argument = $methodCallNode->args[0]->value; $argument = $methodCallNode->args[0]->value;
$serviceName = $argument->value; $serviceName = $argument->value;
$container = $this->getContainerFromKernelClass(); return $this->serviceFromKernelResolver->resolveServiceClassByNameFromKernel(
if (! $container->has($serviceName)) { $serviceName, LocalKernel::class
// service name could not be found );
return null;
}
$service = $container->get($serviceName);
return get_class($service);
} }
private function processMethodCallNode(Class_ $classNode, MethodCall $methodCall): ?PropertyFetch private function processMethodCallNode(Class_ $classNode, MethodCall $methodCall): ?PropertyFetch

View File

@ -11,6 +11,7 @@ use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Scalar\String_; use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Class_;
use PhpParser\NodeVisitorAbstract; use PhpParser\NodeVisitorAbstract;
use Rector\Builder\Kernel\ServiceFromKernelResolver;
use Rector\Builder\Naming\NameResolver; use Rector\Builder\Naming\NameResolver;
use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel; use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
@ -25,6 +26,22 @@ use Symfony\Component\HttpKernel\Kernel;
*/ */
final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract 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: * Return value semantics:
* * null * * null
@ -48,13 +65,13 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
} }
/** /**
* @var NameResolver * @param Assign|MethodCall $assignOrMethodCallNode
*/ */
private $nameResolver; public function reconstruct(Node $assignOrMethodCallNode): void
public function __construct(NameResolver $nameResolver)
{ {
$this->nameResolver = $nameResolver; if ($assignOrMethodCallNode instanceof Assign) {
$this->processAssignment($assignOrMethodCallNode);
}
} }
private function isCandidate(Node $node): bool private function isCandidate(Node $node): bool
@ -79,16 +96,6 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
return false; 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 private function processAssignment(Assign $assignNode): void
{ {
$refactoredMethodCall = $this->processMethodCallNode($assignNode->expr); $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? * Is "$this->get('string')" statements?
*/ */
@ -141,15 +133,9 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
$argument = $methodCallNode->args[0]->value; $argument = $methodCallNode->args[0]->value;
$serviceName = $argument->value; $serviceName = $argument->value;
$container = $this->getContainerFromKernelClass(); return $this->serviceFromKernelResolver->resolveServiceClassByNameFromKernel(
if (! $container->has($serviceName)) { $serviceName, LocalKernel::class
// service name could not be found );
return null;
}
$service = $container->get($serviceName);
return get_class($service);
} }
private function processMethodCallNode(MethodCall $methodCall): ?PropertyFetch private function processMethodCallNode(MethodCall $methodCall): ?PropertyFetch