Validate the extended type for lazy-loaded type extensions
This commit is contained in:
parent
6393ec3169
commit
8826d39e0f
|
@ -231,6 +231,10 @@ Form
|
|||
$form = $this->createForm(MyType::class);
|
||||
```
|
||||
|
||||
* Registering type extensions as a service with an alias which does not
|
||||
match the type returned by `getExtendedType` is now forbidden. Fix your
|
||||
implementation to define the right type.
|
||||
|
||||
Translator
|
||||
----------
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ CHANGELOG
|
|||
* deprecated the "cascade_validation" option in favor of setting "constraints"
|
||||
with the Valid constraint
|
||||
* moved data trimming logic of TrimListener into StringUtil
|
||||
* [BC BREAK] When registering a type extension through the DI extension, the tag alias has to match the actual extended type.
|
||||
|
||||
2.7.0
|
||||
-----
|
||||
|
|
|
@ -68,7 +68,18 @@ class DependencyInjectionExtension implements FormExtensionInterface
|
|||
|
||||
if (isset($this->typeExtensionServiceIds[$name])) {
|
||||
foreach ($this->typeExtensionServiceIds[$name] as $serviceId) {
|
||||
$extensions[] = $this->container->get($serviceId);
|
||||
$extensions[] = $extension = $this->container->get($serviceId);
|
||||
|
||||
// validate result of getExtendedType() to ensure it is consistent with the service definition
|
||||
if ($extension->getExtendedType() !== $name) {
|
||||
throw new InvalidArgumentException(
|
||||
sprintf('The extended type specified for the service "%s" does not match the actual extended type. Expected "%s", given "%s".',
|
||||
$serviceId,
|
||||
$name,
|
||||
$extension->getExtendedType()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Form\Tests\Extension\DependencyInjection;
|
||||
|
||||
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
|
||||
use Symfony\Component\Form\Extension\DependencyInjection\DependencyInjectionExtension;
|
||||
|
||||
class DependencyInjectionExtensionTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testGetTypeExtensions()
|
||||
{
|
||||
$container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
|
||||
|
||||
$typeExtension1 = $this->getMock('Symfony\Component\Form\FormTypeExtensionInterface');
|
||||
$typeExtension1->expects($this->any())
|
||||
->method('getExtendedType')
|
||||
->willReturn('test');
|
||||
$typeExtension2 = $this->getMock('Symfony\Component\Form\FormTypeExtensionInterface');
|
||||
$typeExtension2->expects($this->any())
|
||||
->method('getExtendedType')
|
||||
->willReturn('test');
|
||||
$typeExtension3 = $this->getMock('Symfony\Component\Form\FormTypeExtensionInterface');
|
||||
$typeExtension3->expects($this->any())
|
||||
->method('getExtendedType')
|
||||
->willReturn('other');
|
||||
|
||||
$services = array(
|
||||
'extension1' => $typeExtension1,
|
||||
'extension2' => $typeExtension2,
|
||||
'extension3' => $typeExtension3,
|
||||
);
|
||||
|
||||
$container->expects($this->any())
|
||||
->method('get')
|
||||
->willReturnCallback(function ($id) use ($services) {
|
||||
if (isset($services[$id])) {
|
||||
return $services[$id];
|
||||
}
|
||||
|
||||
throw new ServiceNotFoundException($id);
|
||||
});
|
||||
|
||||
$extension = new DependencyInjectionExtension($container, array(), array('test' => array('extension1', 'extension2'), 'other' => array('extension3')), array());
|
||||
|
||||
$this->assertTrue($extension->hasTypeExtensions('test'));
|
||||
$this->assertFalse($extension->hasTypeExtensions('unknown'));
|
||||
$this->assertSame(array($typeExtension1, $typeExtension2), $extension->getTypeExtensions('test'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
|
||||
*/
|
||||
public function testThrowExceptionForInvalidExtendedType()
|
||||
{
|
||||
$container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
|
||||
|
||||
$typeExtension = $this->getMock('Symfony\Component\Form\FormTypeExtensionInterface');
|
||||
$typeExtension->expects($this->any())
|
||||
->method('getExtendedType')
|
||||
->willReturn('unmatched');
|
||||
|
||||
$container->expects($this->any())
|
||||
->method('get')
|
||||
->with('extension')
|
||||
->willReturn($typeExtension);
|
||||
|
||||
$extension = new DependencyInjectionExtension($container, array(), array('test' => array('extension')), array());
|
||||
|
||||
$extension->getTypeExtensions('test');
|
||||
}
|
||||
}
|
|
@ -26,6 +26,7 @@
|
|||
"symfony/phpunit-bridge": "~2.7|~3.0.0",
|
||||
"doctrine/collections": "~1.0",
|
||||
"symfony/validator": "~2.8|~3.0.0",
|
||||
"symfony/dependency-injection": "~2.3|~3.0.0",
|
||||
"symfony/http-foundation": "~2.2|~3.0.0",
|
||||
"symfony/http-kernel": "~2.4|~3.0.0",
|
||||
"symfony/security-csrf": "~2.4|~3.0.0",
|
||||
|
|
Reference in New Issue