bug #27366 [DI] never inline lazy services (nicolas-grekas)
This PR was merged into the 2.8 branch.
Discussion
----------
[DI] never inline lazy services
| Q | A
| ------------- | ---
| Branch? | 2.7
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | no
| Fixed tickets | -
| License | MIT
| Doc PR | -
Should apply also:
- to deprecated services since 2.8
- to errored services since 3.4
Commits
-------
3b4d7ab56c
[DI] never inline lazy services
This commit is contained in:
commit
4279f53e34
@ -106,11 +106,15 @@ class InlineServiceDefinitionsPass implements RepeatablePassInterface
|
|||||||
*/
|
*/
|
||||||
private function isInlineableDefinition(ContainerBuilder $container, $id, Definition $definition)
|
private function isInlineableDefinition(ContainerBuilder $container, $id, Definition $definition)
|
||||||
{
|
{
|
||||||
|
if ($definition->isDeprecated() || $definition->isLazy() || $definition->isSynthetic()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!$definition->isShared() || ContainerInterface::SCOPE_PROTOTYPE === $definition->getScope(false)) {
|
if (!$definition->isShared() || ContainerInterface::SCOPE_PROTOTYPE === $definition->getScope(false)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($definition->isDeprecated() || $definition->isPublic() || $definition->isLazy()) {
|
if ($definition->isPublic()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\DependencyInjection\Tests\Dumper;
|
namespace Symfony\Component\DependencyInjection\Tests\Dumper;
|
||||||
|
|
||||||
use DummyProxyDumper;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
|
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
|
||||||
@ -278,6 +277,19 @@ class PhpDumperTest extends TestCase
|
|||||||
$this->assertStringEqualsFile(self::$fixturesPath.'/php/services13.php', $dumper->dump(), '->dump() dumps inline definitions which reference service_container');
|
$this->assertStringEqualsFile(self::$fixturesPath.'/php/services13.php', $dumper->dump(), '->dump() dumps inline definitions which reference service_container');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testNonSharedLazyDefinitionReferences()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
$container->register('foo', 'stdClass')->setShared(false)->setLazy(true);
|
||||||
|
$container->register('bar', 'stdClass')->addArgument(new Reference('foo', ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, false));
|
||||||
|
$container->compile();
|
||||||
|
|
||||||
|
$dumper = new PhpDumper($container);
|
||||||
|
$dumper->setProxyDumper(new \DummyProxyDumper());
|
||||||
|
|
||||||
|
$this->assertStringEqualsFile(self::$fixturesPath.'/php/services_non_shared_lazy.php', $dumper->dump());
|
||||||
|
}
|
||||||
|
|
||||||
public function testInitializePropertiesBeforeMethodCalls()
|
public function testInitializePropertiesBeforeMethodCalls()
|
||||||
{
|
{
|
||||||
require_once self::$fixturesPath.'/includes/classes.php';
|
require_once self::$fixturesPath.'/includes/classes.php';
|
||||||
@ -343,7 +355,7 @@ class PhpDumperTest extends TestCase
|
|||||||
|
|
||||||
$dumper = new PhpDumper($container);
|
$dumper = new PhpDumper($container);
|
||||||
|
|
||||||
$dumper->setProxyDumper(new DummyProxyDumper());
|
$dumper->setProxyDumper(new \DummyProxyDumper());
|
||||||
$dumper->dump();
|
$dumper->dump();
|
||||||
|
|
||||||
$this->addToAssertionCount(1);
|
$this->addToAssertionCount(1);
|
||||||
|
@ -84,16 +84,16 @@ class DummyProxyDumper implements ProxyDumper
|
|||||||
{
|
{
|
||||||
public function isProxyCandidate(Definition $definition)
|
public function isProxyCandidate(Definition $definition)
|
||||||
{
|
{
|
||||||
return false;
|
return $definition->isLazy();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getProxyFactoryCode(Definition $definition, $id)
|
public function getProxyFactoryCode(Definition $definition, $id)
|
||||||
{
|
{
|
||||||
return '';
|
return " // lazy factory\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getProxyCode(Definition $definition)
|
public function getProxyCode(Definition $definition)
|
||||||
{
|
{
|
||||||
return '';
|
return "// proxy code\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||||
|
use Symfony\Component\DependencyInjection\Container;
|
||||||
|
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
|
||||||
|
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
|
||||||
|
use Symfony\Component\DependencyInjection\Exception\LogicException;
|
||||||
|
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
|
||||||
|
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class has been auto-generated
|
||||||
|
* by the Symfony Dependency Injection Component.
|
||||||
|
*/
|
||||||
|
class ProjectServiceContainer extends Container
|
||||||
|
{
|
||||||
|
private $parameters;
|
||||||
|
private $targetDirs = array();
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->services =
|
||||||
|
$this->scopedServices =
|
||||||
|
$this->scopeStacks = array();
|
||||||
|
$this->scopes = array();
|
||||||
|
$this->scopeChildren = array();
|
||||||
|
$this->methodMap = array(
|
||||||
|
'bar' => 'getBarService',
|
||||||
|
'foo' => 'getFooService',
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->aliases = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function compile()
|
||||||
|
{
|
||||||
|
throw new LogicException('You cannot compile a dumped frozen container.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function isFrozen()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the public 'bar' shared service.
|
||||||
|
*
|
||||||
|
* @return \stdClass
|
||||||
|
*/
|
||||||
|
protected function getBarService()
|
||||||
|
{
|
||||||
|
return $this->services['bar'] = new \stdClass($this->get('foo'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the public 'foo' service.
|
||||||
|
*
|
||||||
|
* @return \stdClass
|
||||||
|
*/
|
||||||
|
public function getFooService($lazyLoad = true)
|
||||||
|
{
|
||||||
|
// lazy factory
|
||||||
|
|
||||||
|
return new \stdClass();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// proxy code
|
Reference in New Issue
Block a user