mirror of https://github.com/rectorphp/rector.git
decouple ServiceFromKernelResolver
This commit is contained in:
parent
222557c122
commit
94daf88807
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue