Merge branch '3.4'
* 3.4: [DI] Deprecate XML services without ID [3.4] Allow 4.* deps Fix kernel.project_dir extensibility
This commit is contained in:
commit
1ecfa82ff0
@ -1,15 +1,20 @@
|
||||
UPGRADE FROM 3.3 to 3.4
|
||||
=======================
|
||||
|
||||
DependencyInjection
|
||||
-------------------
|
||||
|
||||
* Top-level anonymous services in XML are deprecated and will throw an exception in Symfony 4.0.
|
||||
|
||||
Finder
|
||||
------
|
||||
|
||||
* The `Symfony\Component\Finder\Iterator\FilterIterator` class has been
|
||||
deprecated and will be removed in 4.0 as it used to fix a bug which existed
|
||||
before version 5.5.23/5.6.7
|
||||
before version 5.5.23/5.6.7.
|
||||
|
||||
Validator
|
||||
---------
|
||||
|
||||
* not setting the `strict` option of the `Choice` constraint to `true` is
|
||||
deprecated and will throw an exception in Symfony 4.0
|
||||
* Not setting the `strict` option of the `Choice` constraint to `true` is
|
||||
deprecated and will throw an exception in Symfony 4.0.
|
||||
|
@ -128,6 +128,8 @@ DependencyInjection
|
||||
* The ``strict`` attribute in service arguments has been removed.
|
||||
The attribute is ignored since 3.0, so you can simply remove it.
|
||||
|
||||
* Top-level anonymous services in XML are no longer supported.
|
||||
|
||||
EventDispatcher
|
||||
---------------
|
||||
|
||||
|
@ -52,12 +52,12 @@
|
||||
<argument /> <!-- resource checkers -->
|
||||
</service>
|
||||
|
||||
<service class="Symfony\Component\DependencyInjection\Config\ContainerParametersResourceChecker">
|
||||
<service id="Symfony\Component\DependencyInjection\Config\ContainerParametersResourceChecker">
|
||||
<argument type="service" id="service_container" />
|
||||
<tag name="config_cache.resource_checker" priority="-980" />
|
||||
</service>
|
||||
|
||||
<service class="Symfony\Component\Config\Resource\SelfCheckingResourceChecker">
|
||||
<service id="Symfony\Component\Config\Resource\SelfCheckingResourceChecker">
|
||||
<tag name="config_cache.resource_checker" priority="-990" />
|
||||
</service>
|
||||
</services>
|
||||
|
@ -15,6 +15,7 @@ CHANGELOG
|
||||
-----
|
||||
|
||||
* deprecated the ability to check for the initialization of a private service with the `Container::initialized()` method
|
||||
* deprecated support for top-level anonymous services in XML
|
||||
|
||||
3.3.0
|
||||
-----
|
||||
|
@ -409,6 +409,8 @@ class XmlFileLoader extends FileLoader
|
||||
// anonymous services "in the wild"
|
||||
if (false !== $nodes = $xpath->query('//container:services/container:service[not(@id)]')) {
|
||||
foreach ($nodes as $node) {
|
||||
@trigger_error(sprintf('Top-level anonymous services are deprecated since Symfony 3.4, the "id" attribute will be required in version 4.0 in %s at line %d.', $file, $node->getLineNo()), E_USER_DEPRECATED);
|
||||
|
||||
// give it a unique name
|
||||
$id = sprintf('%d_%s', ++$count, hash('sha256', $file));
|
||||
$node->setAttribute('id', $id);
|
||||
|
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
|
||||
<services>
|
||||
<service id="FooClass">
|
||||
<argument type="service">
|
||||
<service class="BarClass" />
|
||||
</argument>
|
||||
</service>
|
||||
</services>
|
||||
</container>
|
@ -5,7 +5,7 @@
|
||||
<tag name="foo" />
|
||||
</defaults>
|
||||
|
||||
<service class="Bar" public="true" />
|
||||
<service id="bar" class="Bar" public="true" />
|
||||
<service id="with_defaults" class="Foo" />
|
||||
<service id="no_defaults" class="Foo" public="true" autowire="false" />
|
||||
<service id="child_def" parent="with_defaults" public="true" autowire="false" />
|
||||
|
@ -18,7 +18,7 @@
|
||||
</property>
|
||||
</service>
|
||||
<service id="bar" parent="foo" />
|
||||
<service class="BizClass">
|
||||
<service id="biz" class="BizClass">
|
||||
<tag name="biz_tag" />
|
||||
</service>
|
||||
</services>
|
||||
|
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
|
||||
<services>
|
||||
<service class="FooClass"/>
|
||||
<service id="FooClass">
|
||||
<argument type="service">
|
||||
<service class="BarClass" />
|
||||
</argument>
|
||||
</service>
|
||||
</services>
|
||||
</container>
|
@ -230,6 +230,28 @@ class XmlFileLoaderTest extends TestCase
|
||||
$this->assertSame($fooArgs[0], $barArgs[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group legacy
|
||||
* @expectedDeprecation Top-level anonymous services are deprecated since Symfony 3.4, the "id" attribute will be required in version 4.0 in %sservices_without_id.xml at line 4.
|
||||
*/
|
||||
public function testLoadAnonymousServicesWithoutId()
|
||||
{
|
||||
$container = new ContainerBuilder();
|
||||
$loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
|
||||
$loader->load('services_without_id.xml');
|
||||
}
|
||||
|
||||
public function testLoadAnonymousNestedServices()
|
||||
{
|
||||
$container = new ContainerBuilder();
|
||||
$loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
|
||||
$loader->load('nested_service_without_id.xml');
|
||||
|
||||
$this->assertTrue($container->hasDefinition('FooClass'));
|
||||
$arguments = $container->getDefinition('FooClass')->getArguments();
|
||||
$this->assertInstanceOf(Reference::class, array_shift($arguments));
|
||||
}
|
||||
|
||||
public function testLoadServices()
|
||||
{
|
||||
$container = new ContainerBuilder();
|
||||
@ -655,9 +677,8 @@ class XmlFileLoaderTest extends TestCase
|
||||
$this->assertSame('service_container', key($definitions));
|
||||
|
||||
array_shift($definitions);
|
||||
$this->assertStringStartsWith('1_', key($definitions));
|
||||
|
||||
$anonymous = current($definitions);
|
||||
$this->assertSame('bar', key($definitions));
|
||||
$this->assertTrue($anonymous->isPublic());
|
||||
$this->assertTrue($anonymous->isAutowired());
|
||||
$this->assertSame(array('foo' => array(array())), $anonymous->getTags());
|
||||
|
@ -80,7 +80,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
|
||||
$this->environment = $environment;
|
||||
$this->debug = (bool) $debug;
|
||||
$this->rootDir = $this->getRootDir();
|
||||
$this->projectDir = $this->getProjectDir();
|
||||
$this->name = $this->getName();
|
||||
|
||||
if ($this->debug) {
|
||||
@ -546,7 +545,7 @@ abstract class Kernel implements KernelInterface, TerminableInterface
|
||||
|
||||
return array(
|
||||
'kernel.root_dir' => realpath($this->rootDir) ?: $this->rootDir,
|
||||
'kernel.project_dir' => realpath($this->projectDir) ?: $this->projectDir,
|
||||
'kernel.project_dir' => realpath($this->getProjectDir()) ?: $this->getProjectDir(),
|
||||
'kernel.environment' => $this->environment,
|
||||
'kernel.debug' => $this->debug,
|
||||
'kernel.name' => $this->name,
|
||||
|
@ -12,6 +12,7 @@
|
||||
namespace Symfony\Component\HttpKernel\Tests;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Config\Loader\LoaderInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\HttpKernel\Bundle\BundleInterface;
|
||||
use Symfony\Component\HttpKernel\Config\EnvParametersResource;
|
||||
@ -813,3 +814,34 @@ class TestKernel implements HttpKernelInterface
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
class CustomProjectDirKernel extends Kernel
|
||||
{
|
||||
private $baseDir;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct('test', false);
|
||||
|
||||
$this->baseDir = 'foo';
|
||||
}
|
||||
|
||||
public function registerBundles()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function registerContainerConfiguration(LoaderInterface $loader)
|
||||
{
|
||||
}
|
||||
|
||||
public function getProjectDir()
|
||||
{
|
||||
return $this->baseDir;
|
||||
}
|
||||
|
||||
public function getRootDir()
|
||||
{
|
||||
return __DIR__.'/Fixtures';
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user