Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit bbaea98

Browse filesBrowse files
committed
[DI] Replace container injection by explicit service locators
1 parent 91904af commit bbaea98
Copy full SHA for bbaea98
Expand file treeCollapse file tree

34 files changed

+455
-0
lines changed
+44Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\DependencyInjection\Argument;
13+
14+
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
15+
16+
/**
17+
* Represents a service locator able to lazy load a given range of services.
18+
*
19+
* @author Robin Chalas <robin.chalas@gmail.com>
20+
*
21+
* @experimental in version 3.3
22+
*/
23+
class ServiceLocatorArgument implements ArgumentInterface
24+
{
25+
private $values;
26+
27+
/**
28+
* @param array $values An array of mixed entries indexed by identifier
29+
*/
30+
public function __construct(array $values)
31+
{
32+
$this->values = $values;
33+
}
34+
35+
public function getValues()
36+
{
37+
return $this->values;
38+
}
39+
40+
public function setValues(array $values)
41+
{
42+
$this->values = $values;
43+
}
44+
}

‎src/Symfony/Component/DependencyInjection/CHANGELOG.md

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
3.3.0
55
-----
66

7+
* [EXPERIMENTAL] added "service-locator" argument for lazy loading a set of identified values and services
78
* [EXPERIMENTAL] added prototype services for PSR4-based discovery and registration
89
* added `ContainerBuilder::getReflectionClass()` for retrieving and tracking reflection class info
910
* deprecated `ContainerBuilder::getClassResource()`, use `ContainerBuilder::getReflectionClass()` or `ContainerBuilder::addObjectResource()` instead

‎src/Symfony/Component/DependencyInjection/ContainerBuilder.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/ContainerBuilder.php
+10Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\DependencyInjection\Argument\ClosureProxyArgument;
1515
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
1616
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
17+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1718
use Symfony\Component\DependencyInjection\Compiler\Compiler;
1819
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1920
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
@@ -1122,6 +1123,15 @@ public function resolveServices($value)
11221123
foreach ($value as $k => $v) {
11231124
$value[$k] = $this->resolveServices($v);
11241125
}
1126+
} elseif ($value instanceof ServiceLocatorArgument) {
1127+
$parameterBag = $this->getParameterBag();
1128+
$services = array();
1129+
foreach ($value->getValues() as $k => $v) {
1130+
$services[$k] = function () use ($v, $parameterBag) {
1131+
return $this->resolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($v)));
1132+
};
1133+
}
1134+
$value = new ServiceLocator($services);
11251135
} elseif ($value instanceof IteratorArgument) {
11261136
$parameterBag = $this->getParameterBag();
11271137
$value = new RewindableGenerator(function () use ($value, $parameterBag) {

‎src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
+10Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\DependencyInjection\Argument\ClosureProxyArgument;
1515
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
16+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1617
use Symfony\Component\DependencyInjection\Variable;
1718
use Symfony\Component\DependencyInjection\Definition;
1819
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -897,6 +898,7 @@ private function startClass($class, $baseClass, $namespace)
897898
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
898899
use Symfony\Component\DependencyInjection\Exception\LogicException;
899900
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
901+
use Symfony\Component\DependencyInjection\ServiceLocator;
900902
$bagClass
901903
902904
/*{$this->docStar}
@@ -1536,6 +1538,14 @@ private function dumpValue($value, $interpolate = true)
15361538
}
15371539

15381540
return sprintf('array(%s)', implode(', ', $code));
1541+
} elseif ($value instanceof ServiceLocatorArgument) {
1542+
$code = "\n";
1543+
foreach ($value->getValues() as $k => $v) {
1544+
$code .= sprintf(" %s => function () { return %s; },\n", $this->dumpValue($k, $interpolate), $this->dumpValue($v, $interpolate));
1545+
}
1546+
$code .= ' ';
1547+
1548+
return sprintf('new ServiceLocator(array(%s))', $code);
15391549
} elseif ($value instanceof IteratorArgument) {
15401550
$countCode = array();
15411551
$countCode[] = 'function () {';

‎src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\DependencyInjection\Argument\ClosureProxyArgument;
1515
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
16+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1617
use Symfony\Component\DependencyInjection\ContainerInterface;
1718
use Symfony\Component\DependencyInjection\Parameter;
1819
use Symfony\Component\DependencyInjection\Reference;
@@ -291,6 +292,9 @@ private function convertParameters(array $parameters, $type, \DOMElement $parent
291292
if (is_array($value)) {
292293
$element->setAttribute('type', 'collection');
293294
$this->convertParameters($value, $type, $element, 'key');
295+
} elseif ($value instanceof ServiceLocatorArgument) {
296+
$element->setAttribute('type', 'service-locator');
297+
$this->convertParameters($value->getValues(), $type, $element);
294298
} elseif ($value instanceof IteratorArgument) {
295299
$element->setAttribute('type', 'iterator');
296300
$this->convertParameters($value->getValues(), $type, $element, 'key');

‎src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
1818
use Symfony\Component\DependencyInjection\Argument\ClosureProxyArgument;
1919
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
20+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
2021
use Symfony\Component\DependencyInjection\ContainerInterface;
2122
use Symfony\Component\DependencyInjection\Definition;
2223
use Symfony\Component\DependencyInjection\Parameter;
@@ -258,6 +259,8 @@ private function dumpValue($value)
258259
$tag = 'iterator';
259260
} elseif ($value instanceof ClosureProxyArgument) {
260261
$tag = 'closure_proxy';
262+
} elseif ($value instanceof ServiceLocatorArgument) {
263+
$tag = 'service_locator';
261264
} else {
262265
throw new RuntimeException(sprintf('Unspecified Yaml tag for type "%s".', get_class($value)));
263266
}

‎src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Symfony\Component\DependencyInjection\Alias;
1818
use Symfony\Component\DependencyInjection\Argument\ClosureProxyArgument;
1919
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
20+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
2021
use Symfony\Component\DependencyInjection\Definition;
2122
use Symfony\Component\DependencyInjection\ChildDefinition;
2223
use Symfony\Component\DependencyInjection\Reference;
@@ -498,6 +499,9 @@ private function getArgumentsAsPhp(\DOMElement $node, $name, $lowercase = true,
498499
case 'iterator':
499500
$arguments[$key] = new IteratorArgument($this->getArgumentsAsPhp($arg, $name, false));
500501
break;
502+
case 'service-locator':
503+
$arguments[$key] = new ServiceLocatorArgument($this->getArgumentsAsPhp($arg, $name, false));
504+
break;
501505
case 'string':
502506
$arguments[$key] = $arg->nodeValue;
503507
break;

‎src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php
+8Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\DependencyInjection\Alias;
1515
use Symfony\Component\DependencyInjection\Argument\ClosureProxyArgument;
1616
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
17+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1718
use Symfony\Component\DependencyInjection\ChildDefinition;
1819
use Symfony\Component\DependencyInjection\ContainerInterface;
1920
use Symfony\Component\DependencyInjection\Definition;
@@ -616,6 +617,13 @@ private function resolveServices($value)
616617

617618
return new IteratorArgument(array_map(array($this, 'resolveServices'), $argument));
618619
}
620+
if ('service_locator' === $value->getTag()) {
621+
if (!is_array($argument)) {
622+
throw new InvalidArgumentException('"!service_locator" tag only accepts mappings.');
623+
}
624+
625+
return new ServiceLocatorArgument(array_map(array($this, 'resolveServices'), $argument));
626+
}
619627
if ('closure_proxy' === $value->getTag()) {
620628
if (!is_array($argument) || array(0, 1) !== array_keys($argument) || !is_string($argument[0]) || !is_string($argument[1]) || 0 !== strpos($argument[0], '@') || 0 === strpos($argument[0], '@@')) {
621629
throw new InvalidArgumentException('"!closure_proxy" tagged values must be arrays of [@service, method].');

‎src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@
246246
<xsd:enumeration value="string" />
247247
<xsd:enumeration value="constant" />
248248
<xsd:enumeration value="iterator" />
249+
<xsd:enumeration value="service-locator" />
249250
<xsd:enumeration value="closure-proxy" />
250251
</xsd:restriction>
251252
</xsd:simpleType>
+71Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\DependencyInjection;
13+
14+
use Psr\Container\ContainerInterface as PsrContainerInterface;
15+
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
16+
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
17+
18+
/**
19+
* @author Robin Chalas <robin.chalas@gmail.com>
20+
* @author Nicolas Grekas <p@tchwork.com>
21+
*
22+
* @experimental in version 3.3
23+
*/
24+
class ServiceLocator implements PsrContainerInterface
25+
{
26+
private $factories;
27+
private $values = array();
28+
29+
/**
30+
* @param callable[] $factories
31+
*/
32+
public function __construct(array $factories)
33+
{
34+
$this->factories = $factories;
35+
}
36+
37+
/**
38+
* {@inheritdoc}
39+
*/
40+
public function has($id)
41+
{
42+
return isset($this->factories[$id]);
43+
}
44+
45+
/**
46+
* {@inheritdoc}
47+
*/
48+
public function get($id)
49+
{
50+
if (!isset($this->factories[$id])) {
51+
throw new ServiceNotFoundException($id, null, null, array_keys($this->factories));
52+
}
53+
54+
if (true === $factory = $this->factories[$id]) {
55+
throw new ServiceCircularReferenceException($id, array($id, $id));
56+
}
57+
58+
if (false !== $factory) {
59+
$this->factories[$id] = true;
60+
$this->values[$id] = $factory();
61+
$this->factories[$id] = false;
62+
}
63+
64+
return $this->values[$id];
65+
}
66+
67+
public function __invoke($id)
68+
{
69+
return isset($this->factories[$id]) ? $this->get($id) : null;
70+
}
71+
}

‎src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php
+22Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Symfony\Component\DependencyInjection\Argument\ClosureProxyArgument;
2222
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
2323
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
24+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
2425
use Symfony\Component\DependencyInjection\ChildDefinition;
2526
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
2627
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -33,6 +34,7 @@
3334
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
3435
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
3536
use Symfony\Component\Config\Resource\FileResource;
37+
use Symfony\Component\DependencyInjection\ServiceLocator;
3638
use Symfony\Component\DependencyInjection\Tests\Fixtures\CustomDefinition;
3739
use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
3840
use Symfony\Component\ExpressionLanguage\Expression;
@@ -437,6 +439,26 @@ public function testCreateServiceWithIteratorArgument()
437439
$this->assertEquals(1, $i);
438440
}
439441

442+
public function testCreateServiceWithServiceLocatorArgument()
443+
{
444+
$builder = new ContainerBuilder();
445+
$builder->register('bar', 'stdClass');
446+
$builder
447+
->register('lazy_context', 'LazyContext')
448+
->setArguments(array(new ServiceLocatorArgument(array('bar' => new Reference('bar'), 'invalid' => new Reference('invalid', ContainerInterface::IGNORE_ON_INVALID_REFERENCE), 'foo_string' => 'foo', 'foo_collection' => array('foo')))))
449+
;
450+
451+
$lazyContext = $builder->get('lazy_context');
452+
$locator = $lazyContext->lazyValues;
453+
454+
$this->assertInstanceOf(ServiceLocator::class, $locator);
455+
$this->assertInstanceOf('stdClass', $locator->get('bar'));
456+
$this->assertSame('foo', $locator->get('foo_string'));
457+
$this->assertSame(array('foo'), $locator->get('foo_collection'));
458+
$this->assertNull($locator->get('invalid'));
459+
$this->assertSame($locator->get('bar'), $locator('bar'), '->get() should be used when invoking ServiceLocator');
460+
}
461+
440462
/**
441463
* @expectedException \RuntimeException
442464
*/

‎src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
+32Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717
use Symfony\Component\DependencyInjection\ContainerBuilder;
1818
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
1919
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
20+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
2021
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
2122
use Symfony\Component\DependencyInjection\Reference;
2223
use Symfony\Component\DependencyInjection\Definition;
2324
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
25+
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
2426
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
27+
use Symfony\Component\DependencyInjection\ServiceLocator;
2528
use Symfony\Component\DependencyInjection\Variable;
2629
use Symfony\Component\ExpressionLanguage\Expression;
2730

@@ -503,6 +506,35 @@ public function testCircularReferenceAllowanceForInlinedDefinitionsForLazyServic
503506
$dumper->dump();
504507
}
505508

509+
public function testServiceLocatorArgumentProvideServiceLocator()
510+
{
511+
require_once self::$fixturesPath.'/includes/classes.php';
512+
513+
$container = new ContainerBuilder();
514+
$container->register('lazy_referenced', 'stdClass');
515+
$container
516+
->register('lazy_context', 'LazyContext')
517+
->setArguments(array(new ServiceLocatorArgument(array('lazy1' => new Reference('lazy_referenced'), 'lazy2' => new Reference('lazy_referenced'), 'container' => new Reference('service_container')))))
518+
;
519+
$container->compile();
520+
521+
$dumper = new PhpDumper($container);
522+
$dump = $dumper->dump(array('class' => 'Symfony_DI_PhpDumper_Test_Locator_Argument_Provide_Service_Locator'));
523+
$this->assertStringEqualsFile(self::$fixturesPath.'/php/services_locator_argument.php', $dump);
524+
525+
require_once(self::$fixturesPath.'/php/services_locator_argument.php');
526+
527+
$container = new \Symfony_DI_PhpDumper_Test_Locator_Argument_Provide_Service_Locator();
528+
$lazyContext = $container->get('lazy_context');
529+
530+
$this->assertInstanceOf(ServiceLocator::class, $lazyContext->lazyValues);
531+
$this->assertSame($container, $lazyContext->lazyValues->get('container'));
532+
$this->assertInstanceOf('stdClass', $lazy1 = $lazyContext->lazyValues->get('lazy1'));
533+
$this->assertInstanceOf('stdClass', $lazy2 = $lazyContext->lazyValues->get('lazy2'));
534+
$this->assertSame($lazy1, $lazy2);
535+
$this->assertFalse($lazyContext->lazyValues->has('lazy_referenced'), '->has() returns false for the original service id, only the key can be used');
536+
}
537+
506538
public function testLazyArgumentProvideGenerator()
507539
{
508540
require_once self::$fixturesPath.'/includes/classes.php';

‎src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
88
use Symfony\Component\DependencyInjection\Exception\LogicException;
99
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
10+
use Symfony\Component\DependencyInjection\ServiceLocator;
1011
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
1112

1213
/**

‎src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
77
use Symfony\Component\DependencyInjection\Exception\LogicException;
88
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
9+
use Symfony\Component\DependencyInjection\ServiceLocator;
910
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
1011

1112
/**

‎src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
77
use Symfony\Component\DependencyInjection\Exception\LogicException;
88
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
9+
use Symfony\Component\DependencyInjection\ServiceLocator;
910
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
1011

1112
/**

‎src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services12.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services12.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
77
use Symfony\Component\DependencyInjection\Exception\LogicException;
88
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
9+
use Symfony\Component\DependencyInjection\ServiceLocator;
910
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
1011

1112
/**

‎src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services13.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services13.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
77
use Symfony\Component\DependencyInjection\Exception\LogicException;
88
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
9+
use Symfony\Component\DependencyInjection\ServiceLocator;
910
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
1011

1112
/**

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.