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\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

View File

@ -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