Merge branch '4.4'
* 4.4: [PhpUnitBridge] Bump PHPUnit 7+8 Prepare for PHP 7.4 preload prevent double deprecation message [Validator] Deprecate unused arg in ExpressionValidator [Config] Introduce find method in ArrayNodeDefinition to ease configuration tree manipulation [DomCrawler][Feature][DX] Add Form::getName() method [VarDumper] caster for HttpClient's response dumps all info
This commit is contained in:
commit
ac7d168ffa
@ -85,3 +85,9 @@ TwigBridge
|
|||||||
|
|
||||||
* Deprecated to pass `$rootDir` and `$fileLinkFormatter` as 5th and 6th argument respectively to the
|
* Deprecated to pass `$rootDir` and `$fileLinkFormatter` as 5th and 6th argument respectively to the
|
||||||
`DebugCommand::__construct()` method, swap the variables position.
|
`DebugCommand::__construct()` method, swap the variables position.
|
||||||
|
|
||||||
|
Validator
|
||||||
|
---------
|
||||||
|
|
||||||
|
* Deprecated passing an `ExpressionLanguage` instance as the second argument of `ExpressionValidator::__construct()`.
|
||||||
|
Pass it as the first argument instead.
|
||||||
|
@ -475,6 +475,7 @@ TwigBridge
|
|||||||
Validator
|
Validator
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
* An `ExpressionLanguage` instance or null must be passed as the first argument of `ExpressionValidator::__construct()`
|
||||||
* The `checkMX` and `checkHost` options of the `Email` constraint were removed
|
* The `checkMX` and `checkHost` options of the `Email` constraint were removed
|
||||||
* The `Email::__construct()` 'strict' property has been removed. Use 'mode'=>"strict" instead.
|
* The `Email::__construct()` 'strict' property has been removed. Use 'mode'=>"strict" instead.
|
||||||
* Calling `EmailValidator::__construct()` method with a boolean parameter has been removed, use `EmailValidator("strict")` instead.
|
* Calling `EmailValidator::__construct()` method with a boolean parameter has been removed, use `EmailValidator("strict")` instead.
|
||||||
|
@ -47,9 +47,12 @@ $getEnvVar = function ($name, $default = false) {
|
|||||||
return $default;
|
return $default;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (PHP_VERSION_ID >= 70100) {
|
if (PHP_VERSION_ID >= 70200) {
|
||||||
|
// PHPUnit 8 requires PHP 7.2+
|
||||||
|
$PHPUNIT_VERSION = $getEnvVar('SYMFONY_PHPUNIT_VERSION', '8.2');
|
||||||
|
} elseif (PHP_VERSION_ID >= 70100) {
|
||||||
// PHPUnit 7 requires PHP 7.1+
|
// PHPUnit 7 requires PHP 7.1+
|
||||||
$PHPUNIT_VERSION = $getEnvVar('SYMFONY_PHPUNIT_VERSION', '7.4');
|
$PHPUNIT_VERSION = $getEnvVar('SYMFONY_PHPUNIT_VERSION', '7.5');
|
||||||
} elseif (PHP_VERSION_ID >= 70000) {
|
} elseif (PHP_VERSION_ID >= 70000) {
|
||||||
// PHPUnit 6 requires PHP 7.0+
|
// PHPUnit 6 requires PHP 7.0+
|
||||||
$PHPUNIT_VERSION = $getEnvVar('SYMFONY_PHPUNIT_VERSION', '6.5');
|
$PHPUNIT_VERSION = $getEnvVar('SYMFONY_PHPUNIT_VERSION', '6.5');
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
<?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\Cache\Exception;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheException as Psr6CacheInterface;
|
||||||
|
use Psr\SimpleCache\CacheException as SimpleCacheInterface;
|
||||||
|
|
||||||
|
class CacheException extends \Exception implements Psr6CacheInterface, SimpleCacheInterface
|
||||||
|
{
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
<?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\Cache\Exception;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheException as Psr6CacheInterface;
|
||||||
|
|
||||||
|
class CacheException extends \Exception implements Psr6CacheInterface
|
||||||
|
{
|
||||||
|
}
|
@ -11,15 +11,10 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Cache\Exception;
|
namespace Symfony\Component\Cache\Exception;
|
||||||
|
|
||||||
use Psr\Cache\CacheException as Psr6CacheInterface;
|
|
||||||
use Psr\SimpleCache\CacheException as SimpleCacheInterface;
|
use Psr\SimpleCache\CacheException as SimpleCacheInterface;
|
||||||
|
|
||||||
if (interface_exists(SimpleCacheInterface::class)) {
|
if (interface_exists(SimpleCacheInterface::class)) {
|
||||||
class CacheException extends \Exception implements Psr6CacheInterface, SimpleCacheInterface
|
require __DIR__.\DIRECTORY_SEPARATOR.'CacheException+psr16.php';
|
||||||
{
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
class CacheException extends \Exception implements Psr6CacheInterface
|
require __DIR__.\DIRECTORY_SEPARATOR.'CacheException-psr16.php';
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
<?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\Cache\Exception;
|
||||||
|
|
||||||
|
use Psr\Cache\InvalidArgumentException as Psr6CacheInterface;
|
||||||
|
use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInterface;
|
||||||
|
|
||||||
|
class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface, SimpleCacheInterface
|
||||||
|
{
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
<?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\Cache\Exception;
|
||||||
|
|
||||||
|
use Psr\Cache\InvalidArgumentException as Psr6CacheInterface;
|
||||||
|
|
||||||
|
class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface
|
||||||
|
{
|
||||||
|
}
|
@ -11,15 +11,10 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Cache\Exception;
|
namespace Symfony\Component\Cache\Exception;
|
||||||
|
|
||||||
use Psr\Cache\InvalidArgumentException as Psr6CacheInterface;
|
|
||||||
use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInterface;
|
use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInterface;
|
||||||
|
|
||||||
if (interface_exists(SimpleCacheInterface::class)) {
|
if (interface_exists(SimpleCacheInterface::class)) {
|
||||||
class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface, SimpleCacheInterface
|
require __DIR__.\DIRECTORY_SEPARATOR.'InvalidArgumentException+psr16.php';
|
||||||
{
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface
|
require __DIR__.\DIRECTORY_SEPARATOR.'InvalidArgumentException-psr16.php';
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
<?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\Cache\Exception;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheException as Psr6CacheInterface;
|
||||||
|
use Psr\SimpleCache\CacheException as SimpleCacheInterface;
|
||||||
|
|
||||||
|
class LogicException extends \LogicException implements Psr6CacheInterface, SimpleCacheInterface
|
||||||
|
{
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
<?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\Cache\Exception;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheException as Psr6CacheInterface;
|
||||||
|
|
||||||
|
class LogicException extends \LogicException implements Psr6CacheInterface
|
||||||
|
{
|
||||||
|
}
|
@ -11,15 +11,10 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Cache\Exception;
|
namespace Symfony\Component\Cache\Exception;
|
||||||
|
|
||||||
use Psr\Cache\CacheException as Psr6CacheInterface;
|
use Psr\SimpleCache\LogicException as SimpleCacheInterface;
|
||||||
use Psr\SimpleCache\CacheException as SimpleCacheInterface;
|
|
||||||
|
|
||||||
if (interface_exists(SimpleCacheInterface::class)) {
|
if (interface_exists(SimpleCacheInterface::class)) {
|
||||||
class LogicException extends \LogicException implements Psr6CacheInterface, SimpleCacheInterface
|
require __DIR__.\DIRECTORY_SEPARATOR.'LogicException-psr16.php';
|
||||||
{
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
class LogicException extends \LogicException implements Psr6CacheInterface
|
require __DIR__.\DIRECTORY_SEPARATOR.'LogicException-psr16.php';
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -523,4 +523,26 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
|
|||||||
{
|
{
|
||||||
return $this->children;
|
return $this->children;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds a node defined by the given $nodePath.
|
||||||
|
*
|
||||||
|
* @param string $nodePath The path of the node to find. e.g "doctrine.orm.mappings"
|
||||||
|
*/
|
||||||
|
public function find(string $nodePath): NodeDefinition
|
||||||
|
{
|
||||||
|
$firstPathSegment = (false === $pathSeparatorPos = strpos($nodePath, $this->pathSeparator))
|
||||||
|
? $nodePath
|
||||||
|
: substr($nodePath, 0, $pathSeparatorPos);
|
||||||
|
|
||||||
|
if (null === $node = ($this->children[$firstPathSegment] ?? null)) {
|
||||||
|
throw new \RuntimeException(sprintf('Node with name "%s" does not exist in the current node "%s".', $firstPathSegment, $this->name));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false === $pathSeparatorPos) {
|
||||||
|
return $node;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $node->find(substr($nodePath, $pathSeparatorPos + \strlen($this->pathSeparator)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@ namespace Symfony\Component\Config\Tests\Definition\Builder;
|
|||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
|
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
|
||||||
|
use Symfony\Component\Config\Definition\Builder\BooleanNodeDefinition;
|
||||||
|
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
|
||||||
use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition;
|
use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition;
|
||||||
use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;
|
use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;
|
||||||
use Symfony\Component\Config\Definition\Processor;
|
use Symfony\Component\Config\Definition\Processor;
|
||||||
@ -357,6 +359,85 @@ class ArrayNodeDefinitionTest extends TestCase
|
|||||||
$node->getNode()->finalize([]);
|
$node->getNode()->finalize([]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testFindShouldThrowExceptionIfNodeDoesNotExistInRootNode()
|
||||||
|
{
|
||||||
|
$this->expectException(\RuntimeException::class);
|
||||||
|
$this->expectExceptionMessage('Node with name "child" does not exist in the current node "root".');
|
||||||
|
|
||||||
|
$rootNode = new ArrayNodeDefinition('root');
|
||||||
|
$rootNode
|
||||||
|
->children()
|
||||||
|
->arrayNode('social_media_channels')->end()
|
||||||
|
->end()
|
||||||
|
;
|
||||||
|
|
||||||
|
$rootNode->find('child');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFindShouldHandleComplexConfigurationProperly()
|
||||||
|
{
|
||||||
|
$rootNode = new ArrayNodeDefinition('root');
|
||||||
|
$rootNode
|
||||||
|
->children()
|
||||||
|
->arrayNode('social_media_channels')
|
||||||
|
->children()
|
||||||
|
->booleanNode('enable')->end()
|
||||||
|
->arrayNode('twitter')->end()
|
||||||
|
->arrayNode('facebook')->end()
|
||||||
|
->arrayNode('instagram')
|
||||||
|
->children()
|
||||||
|
->booleanNode('enable')->end()
|
||||||
|
->arrayNode('accounts')->end()
|
||||||
|
->end()
|
||||||
|
->end()
|
||||||
|
->end()
|
||||||
|
->append(
|
||||||
|
$mailerNode = (new ArrayNodeDefinition('mailer'))
|
||||||
|
->children()
|
||||||
|
->booleanNode('enable')->end()
|
||||||
|
->arrayNode('transports')->end()
|
||||||
|
->end()
|
||||||
|
)
|
||||||
|
->end()
|
||||||
|
;
|
||||||
|
|
||||||
|
$this->assertNode('social_media_channels', ArrayNodeDefinition::class, $rootNode->find('social_media_channels'));
|
||||||
|
$this->assertNode('enable', BooleanNodeDefinition::class, $rootNode->find('social_media_channels.enable'));
|
||||||
|
$this->assertNode('twitter', ArrayNodeDefinition::class, $rootNode->find('social_media_channels.twitter'));
|
||||||
|
$this->assertNode('facebook', ArrayNodeDefinition::class, $rootNode->find('social_media_channels.facebook'));
|
||||||
|
$this->assertNode('instagram', ArrayNodeDefinition::class, $rootNode->find('social_media_channels.instagram'));
|
||||||
|
$this->assertNode('enable', BooleanNodeDefinition::class, $rootNode->find('social_media_channels.instagram.enable'));
|
||||||
|
$this->assertNode('accounts', ArrayNodeDefinition::class, $rootNode->find('social_media_channels.instagram.accounts'));
|
||||||
|
|
||||||
|
$this->assertNode('enable', BooleanNodeDefinition::class, $mailerNode->find('enable'));
|
||||||
|
$this->assertNode('transports', ArrayNodeDefinition::class, $mailerNode->find('transports'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFindShouldWorkProperlyForNonDefaultPathSeparator()
|
||||||
|
{
|
||||||
|
$rootNode = new ArrayNodeDefinition('root');
|
||||||
|
$rootNode
|
||||||
|
->setPathSeparator('.|')
|
||||||
|
->children()
|
||||||
|
->arrayNode('mailer.configuration')
|
||||||
|
->children()
|
||||||
|
->booleanNode('enable')->end()
|
||||||
|
->arrayNode('transports')->end()
|
||||||
|
->end()
|
||||||
|
->end()
|
||||||
|
;
|
||||||
|
|
||||||
|
$this->assertNode('mailer.configuration', ArrayNodeDefinition::class, $rootNode->find('mailer.configuration'));
|
||||||
|
$this->assertNode('enable', BooleanNodeDefinition::class, $rootNode->find('mailer.configuration.|enable'));
|
||||||
|
$this->assertNode('transports', ArrayNodeDefinition::class, $rootNode->find('mailer.configuration.|transports'));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function assertNode(string $expectedName, string $expectedType, NodeDefinition $actualNode): void
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf($expectedType, $actualNode);
|
||||||
|
$this->assertSame($expectedName, $this->getField($actualNode, 'name'));
|
||||||
|
}
|
||||||
|
|
||||||
protected function getField($object, $field)
|
protected function getField($object, $field)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionProperty($object, $field);
|
$reflection = new \ReflectionProperty($object, $field);
|
||||||
|
@ -7,6 +7,11 @@ CHANGELOG
|
|||||||
* Added argument `$selector` to ``Crawler::children()`
|
* Added argument `$selector` to ``Crawler::children()`
|
||||||
* Added argument `$default` to ``Crawler::text()` and `html()`
|
* Added argument `$default` to ``Crawler::text()` and `html()`
|
||||||
|
|
||||||
|
4.4.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Added `Form::getName()` method.
|
||||||
|
|
||||||
4.3.0
|
4.3.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@ -250,6 +250,16 @@ class Form extends Link implements \ArrayAccess
|
|||||||
return $this->node->getAttribute('method') ? strtoupper($this->node->getAttribute('method')) : 'GET';
|
return $this->node->getAttribute('method') ? strtoupper($this->node->getAttribute('method')) : 'GET';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the form name.
|
||||||
|
*
|
||||||
|
* If no name is defined on the form, an empty string is returned.
|
||||||
|
*/
|
||||||
|
public function getName(): string
|
||||||
|
{
|
||||||
|
return $this->node->getAttribute('name');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the named field exists.
|
* Returns true if the named field exists.
|
||||||
*
|
*
|
||||||
|
@ -327,6 +327,18 @@ class FormTest extends TestCase
|
|||||||
$this->assertEquals('POST', $form->getMethod(), '->getMethod() returns the method attribute value of the form');
|
$this->assertEquals('POST', $form->getMethod(), '->getMethod() returns the method attribute value of the form');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetName()
|
||||||
|
{
|
||||||
|
$form = $this->createForm('<form name="foo"><input type="submit" /></form>');
|
||||||
|
$this->assertSame('foo', $form->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetNameOnFormWithoutName()
|
||||||
|
{
|
||||||
|
$form = $this->createForm('<form><input type="submit" /></form>');
|
||||||
|
$this->assertSame('', $form->getName());
|
||||||
|
}
|
||||||
|
|
||||||
public function testGetSetValue()
|
public function testGetSetValue()
|
||||||
{
|
{
|
||||||
$form = $this->createForm('<form><input type="text" name="foo" value="foo" /><input type="submit" /></form>');
|
$form = $this->createForm('<form><input type="text" name="foo" value="foo" /><input type="submit" /></form>');
|
||||||
|
@ -16,6 +16,7 @@ CHANGELOG
|
|||||||
4.4.0
|
4.4.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
* deprecated passing an `ExpressionLanguage` instance as the second argument of `ExpressionValidator::__construct()`. Pass it as the first argument instead.
|
||||||
* added the `compared_value_path` parameter in violations when using any
|
* added the `compared_value_path` parameter in violations when using any
|
||||||
comparison constraint with the `propertyPath` option.
|
comparison constraint with the `propertyPath` option.
|
||||||
* added support for checking an array of types in `TypeValidator`
|
* added support for checking an array of types in `TypeValidator`
|
||||||
|
@ -24,8 +24,20 @@ class ExpressionValidator extends ConstraintValidator
|
|||||||
{
|
{
|
||||||
private $expressionLanguage;
|
private $expressionLanguage;
|
||||||
|
|
||||||
public function __construct($propertyAccessor = null, ExpressionLanguage $expressionLanguage = null)
|
public function __construct(/*ExpressionLanguage */$expressionLanguage = null)
|
||||||
{
|
{
|
||||||
|
if (\func_num_args() > 1) {
|
||||||
|
@trigger_error(sprintf('The "%s" instance should be passed as "%s" first argument instead of second argument since 4.4.', ExpressionLanguage::class, __METHOD__), E_USER_DEPRECATED);
|
||||||
|
|
||||||
|
$expressionLanguage = func_get_arg(1);
|
||||||
|
|
||||||
|
if (null !== $expressionLanguage && !$expressionLanguage instanceof ExpressionLanguage) {
|
||||||
|
throw new \TypeError(sprintf('Argument 2 passed to %s() must be an instance of %s or null, %s given. Since 4.4, passing it as the second argument is deprecated and will trigger a deprecation. Pass it as the first argument instead.', __METHOD__, ExpressionLanguage::class, \is_object($expressionLanguage) ? \get_class($expressionLanguage) : \gettype($expressionLanguage)));
|
||||||
|
}
|
||||||
|
} elseif (null !== $expressionLanguage && !$expressionLanguage instanceof ExpressionLanguage) {
|
||||||
|
@trigger_error(sprintf('The "%s" first argument must be an instance of "%s" or null since 4.4. "%s" given', __METHOD__, ExpressionLanguage::class, \is_object($expressionLanguage) ? \get_class($expressionLanguage) : \gettype($expressionLanguage)), E_USER_DEPRECATED);
|
||||||
|
}
|
||||||
|
|
||||||
$this->expressionLanguage = $expressionLanguage;
|
$this->expressionLanguage = $expressionLanguage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Validator\Tests\Constraints;
|
namespace Symfony\Component\Validator\Tests\Constraints;
|
||||||
|
|
||||||
|
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
|
||||||
use Symfony\Component\Validator\Constraints\Expression;
|
use Symfony\Component\Validator\Constraints\Expression;
|
||||||
use Symfony\Component\Validator\Constraints\ExpressionValidator;
|
use Symfony\Component\Validator\Constraints\ExpressionValidator;
|
||||||
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
|
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
|
||||||
@ -253,6 +254,34 @@ class ExpressionValidatorTest extends ConstraintValidatorTestCase
|
|||||||
'expression' => 'false',
|
'expression' => 'false',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$expressionLanguage = $this->getMockBuilder(ExpressionLanguage::class)->getMock();
|
||||||
|
|
||||||
|
$used = false;
|
||||||
|
|
||||||
|
$expressionLanguage->method('evaluate')
|
||||||
|
->willReturnCallback(function () use (&$used) {
|
||||||
|
$used = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
$validator = new ExpressionValidator($expressionLanguage);
|
||||||
|
$validator->initialize($this->createContext());
|
||||||
|
$validator->validate(null, $constraint);
|
||||||
|
|
||||||
|
$this->assertTrue($used, 'Failed asserting that custom ExpressionLanguage instance is used.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group legacy
|
||||||
|
* @expectedDeprecation The "Symfony\Component\ExpressionLanguage\ExpressionLanguage" instance should be passed as "Symfony\Component\Validator\Constraints\ExpressionValidator::__construct" first argument instead of second argument since 4.4.
|
||||||
|
*/
|
||||||
|
public function testLegacyExpressionLanguageUsage()
|
||||||
|
{
|
||||||
|
$constraint = new Expression([
|
||||||
|
'expression' => 'false',
|
||||||
|
]);
|
||||||
|
|
||||||
$expressionLanguage = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ExpressionLanguage')->getMock();
|
$expressionLanguage = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ExpressionLanguage')->getMock();
|
||||||
|
|
||||||
$used = false;
|
$used = false;
|
||||||
@ -271,6 +300,15 @@ class ExpressionValidatorTest extends ConstraintValidatorTestCase
|
|||||||
$this->assertTrue($used, 'Failed asserting that custom ExpressionLanguage instance is used.');
|
$this->assertTrue($used, 'Failed asserting that custom ExpressionLanguage instance is used.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group legacy
|
||||||
|
* @expectedDeprecation The "Symfony\Component\Validator\Constraints\ExpressionValidator::__construct" first argument must be an instance of "Symfony\Component\ExpressionLanguage\ExpressionLanguage" or null since 4.4. "string" given
|
||||||
|
*/
|
||||||
|
public function testConstructorInvalidType()
|
||||||
|
{
|
||||||
|
new ExpressionValidator('foo');
|
||||||
|
}
|
||||||
|
|
||||||
public function testPassingCustomValues()
|
public function testPassingCustomValues()
|
||||||
{
|
{
|
||||||
$constraint = new Expression([
|
$constraint = new Expression([
|
||||||
|
@ -48,4 +48,16 @@ class SymfonyCaster
|
|||||||
|
|
||||||
return $a;
|
return $a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function castHttpClientResponse($response, array $a, Stub $stub, $isNested)
|
||||||
|
{
|
||||||
|
$stub->cut += \count($a);
|
||||||
|
$a = [];
|
||||||
|
|
||||||
|
foreach ($response->getInfo() + ['debug' => $response->getInfo('debug')] as $k => $v) {
|
||||||
|
$a[Caster::PREFIX_VIRTUAL.$k] = $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $a;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,8 +78,8 @@ abstract class AbstractCloner implements ClonerInterface
|
|||||||
'Symfony\Component\DependencyInjection\ContainerInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
|
'Symfony\Component\DependencyInjection\ContainerInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
|
||||||
'Symfony\Component\HttpClient\CurlHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'],
|
'Symfony\Component\HttpClient\CurlHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'],
|
||||||
'Symfony\Component\HttpClient\NativeHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'],
|
'Symfony\Component\HttpClient\NativeHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'],
|
||||||
'Symfony\Component\HttpClient\Response\CurlResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'],
|
'Symfony\Component\HttpClient\Response\CurlResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'],
|
||||||
'Symfony\Component\HttpClient\Response\NativeResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'],
|
'Symfony\Component\HttpClient\Response\NativeResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'],
|
||||||
'Symfony\Component\HttpFoundation\Request' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castRequest'],
|
'Symfony\Component\HttpFoundation\Request' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castRequest'],
|
||||||
'Symfony\Component\VarDumper\Exception\ThrowingCasterException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castThrowingCasterException'],
|
'Symfony\Component\VarDumper\Exception\ThrowingCasterException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castThrowingCasterException'],
|
||||||
'Symfony\Component\VarDumper\Caster\TraceStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'],
|
'Symfony\Component\VarDumper\Caster\TraceStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'],
|
||||||
|
54
src/Symfony/Contracts/EventDispatcher/Event+psr14.php
Normal file
54
src/Symfony/Contracts/EventDispatcher/Event+psr14.php
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?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\Contracts\EventDispatcher;
|
||||||
|
|
||||||
|
use Psr\EventDispatcher\StoppableEventInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event is the base class for classes containing event data.
|
||||||
|
*
|
||||||
|
* This class contains no event data. It is used by events that do not pass
|
||||||
|
* state information to an event handler when an event is raised.
|
||||||
|
*
|
||||||
|
* You can call the method stopPropagation() to abort the execution of
|
||||||
|
* further listeners in your event listener.
|
||||||
|
*
|
||||||
|
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
||||||
|
* @author Jonathan Wage <jonwage@gmail.com>
|
||||||
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
|
* @author Nicolas Grekas <p@tchwork.com>
|
||||||
|
*/
|
||||||
|
class Event implements StoppableEventInterface
|
||||||
|
{
|
||||||
|
private $propagationStopped = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether further event listeners should be triggered.
|
||||||
|
*/
|
||||||
|
public function isPropagationStopped(): bool
|
||||||
|
{
|
||||||
|
return $this->propagationStopped;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the propagation of the event to further event listeners.
|
||||||
|
*
|
||||||
|
* If multiple event listeners are connected to the same event, no
|
||||||
|
* further event listener will be triggered once any trigger calls
|
||||||
|
* stopPropagation().
|
||||||
|
*/
|
||||||
|
public function stopPropagation(): void
|
||||||
|
{
|
||||||
|
$this->propagationStopped = true;
|
||||||
|
}
|
||||||
|
}
|
52
src/Symfony/Contracts/EventDispatcher/Event-psr14.php
Normal file
52
src/Symfony/Contracts/EventDispatcher/Event-psr14.php
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?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\Contracts\EventDispatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event is the base class for classes containing event data.
|
||||||
|
*
|
||||||
|
* This class contains no event data. It is used by events that do not pass
|
||||||
|
* state information to an event handler when an event is raised.
|
||||||
|
*
|
||||||
|
* You can call the method stopPropagation() to abort the execution of
|
||||||
|
* further listeners in your event listener.
|
||||||
|
*
|
||||||
|
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
||||||
|
* @author Jonathan Wage <jonwage@gmail.com>
|
||||||
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
|
* @author Nicolas Grekas <p@tchwork.com>
|
||||||
|
*/
|
||||||
|
class Event
|
||||||
|
{
|
||||||
|
private $propagationStopped = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether further event listeners should be triggered.
|
||||||
|
*/
|
||||||
|
public function isPropagationStopped(): bool
|
||||||
|
{
|
||||||
|
return $this->propagationStopped;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the propagation of the event to further event listeners.
|
||||||
|
*
|
||||||
|
* If multiple event listeners are connected to the same event, no
|
||||||
|
* further event listener will be triggered once any trigger calls
|
||||||
|
* stopPropagation().
|
||||||
|
*/
|
||||||
|
public function stopPropagation(): void
|
||||||
|
{
|
||||||
|
$this->propagationStopped = true;
|
||||||
|
}
|
||||||
|
}
|
@ -14,83 +14,7 @@ namespace Symfony\Contracts\EventDispatcher;
|
|||||||
use Psr\EventDispatcher\StoppableEventInterface;
|
use Psr\EventDispatcher\StoppableEventInterface;
|
||||||
|
|
||||||
if (interface_exists(StoppableEventInterface::class)) {
|
if (interface_exists(StoppableEventInterface::class)) {
|
||||||
/**
|
require __DIR__.\DIRECTORY_SEPARATOR.'Event+psr14.php';
|
||||||
* Event is the base class for classes containing event data.
|
|
||||||
*
|
|
||||||
* This class contains no event data. It is used by events that do not pass
|
|
||||||
* state information to an event handler when an event is raised.
|
|
||||||
*
|
|
||||||
* You can call the method stopPropagation() to abort the execution of
|
|
||||||
* further listeners in your event listener.
|
|
||||||
*
|
|
||||||
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
|
||||||
* @author Jonathan Wage <jonwage@gmail.com>
|
|
||||||
* @author Roman Borschel <roman@code-factory.org>
|
|
||||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
|
||||||
* @author Nicolas Grekas <p@tchwork.com>
|
|
||||||
*/
|
|
||||||
class Event implements StoppableEventInterface
|
|
||||||
{
|
|
||||||
private $propagationStopped = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether further event listeners should be triggered.
|
|
||||||
*/
|
|
||||||
public function isPropagationStopped(): bool
|
|
||||||
{
|
|
||||||
return $this->propagationStopped;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops the propagation of the event to further event listeners.
|
|
||||||
*
|
|
||||||
* If multiple event listeners are connected to the same event, no
|
|
||||||
* further event listener will be triggered once any trigger calls
|
|
||||||
* stopPropagation().
|
|
||||||
*/
|
|
||||||
public function stopPropagation(): void
|
|
||||||
{
|
|
||||||
$this->propagationStopped = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/**
|
require __DIR__.\DIRECTORY_SEPARATOR.'Event-psr14.php';
|
||||||
* Event is the base class for classes containing event data.
|
|
||||||
*
|
|
||||||
* This class contains no event data. It is used by events that do not pass
|
|
||||||
* state information to an event handler when an event is raised.
|
|
||||||
*
|
|
||||||
* You can call the method stopPropagation() to abort the execution of
|
|
||||||
* further listeners in your event listener.
|
|
||||||
*
|
|
||||||
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
|
||||||
* @author Jonathan Wage <jonwage@gmail.com>
|
|
||||||
* @author Roman Borschel <roman@code-factory.org>
|
|
||||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
|
||||||
* @author Nicolas Grekas <p@tchwork.com>
|
|
||||||
*/
|
|
||||||
class Event
|
|
||||||
{
|
|
||||||
private $propagationStopped = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether further event listeners should be triggered.
|
|
||||||
*/
|
|
||||||
public function isPropagationStopped(): bool
|
|
||||||
{
|
|
||||||
return $this->propagationStopped;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops the propagation of the event to further event listeners.
|
|
||||||
*
|
|
||||||
* If multiple event listeners are connected to the same event, no
|
|
||||||
* further event listener will be triggered once any trigger calls
|
|
||||||
* stopPropagation().
|
|
||||||
*/
|
|
||||||
public function stopPropagation(): void
|
|
||||||
{
|
|
||||||
$this->propagationStopped = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
<?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\Contracts\EventDispatcher;
|
||||||
|
|
||||||
|
use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows providing hooks on domain-specific lifecycles by dispatching events.
|
||||||
|
*/
|
||||||
|
interface EventDispatcherInterface extends PsrEventDispatcherInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Dispatches an event to all registered listeners.
|
||||||
|
*
|
||||||
|
* For BC with Symfony 4, the $eventName argument is not declared explicitly on the
|
||||||
|
* signature of the method. Implementations that are not bound by this BC constraint
|
||||||
|
* MUST declare it explicitly, as allowed by PHP.
|
||||||
|
*
|
||||||
|
* @param object $event The event to pass to the event handlers/listeners
|
||||||
|
* @param string|null $eventName The name of the event to dispatch. If not supplied,
|
||||||
|
* the class of $event should be used instead.
|
||||||
|
*
|
||||||
|
* @return object The passed $event MUST be returned
|
||||||
|
*/
|
||||||
|
public function dispatch($event/*, string $eventName = null*/);
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
<?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\Contracts\EventDispatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows providing hooks on domain-specific lifecycles by dispatching events.
|
||||||
|
*/
|
||||||
|
interface EventDispatcherInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Dispatches an event to all registered listeners.
|
||||||
|
*
|
||||||
|
* For BC with Symfony 4, the $eventName argument is not declared explicitly on the
|
||||||
|
* signature of the method. Implementations that are not bound by this BC constraint
|
||||||
|
* MUST declare it explicitly, as allowed by PHP.
|
||||||
|
*
|
||||||
|
* @param object $event The event to pass to the event handlers/listeners
|
||||||
|
* @param string|null $eventName The name of the event to dispatch. If not supplied,
|
||||||
|
* the class of $event should be used instead.
|
||||||
|
*
|
||||||
|
* @return object The passed $event MUST be returned
|
||||||
|
*/
|
||||||
|
public function dispatch($event/*, string $eventName = null*/);
|
||||||
|
}
|
@ -14,45 +14,7 @@ namespace Symfony\Contracts\EventDispatcher;
|
|||||||
use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface;
|
use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface;
|
||||||
|
|
||||||
if (interface_exists(PsrEventDispatcherInterface::class)) {
|
if (interface_exists(PsrEventDispatcherInterface::class)) {
|
||||||
/**
|
require __DIR__.\DIRECTORY_SEPARATOR.'EventDispatcherInterface+psr14.php';
|
||||||
* Allows providing hooks on domain-specific lifecycles by dispatching events.
|
|
||||||
*/
|
|
||||||
interface EventDispatcherInterface extends PsrEventDispatcherInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Dispatches an event to all registered listeners.
|
|
||||||
*
|
|
||||||
* For BC with Symfony 4, the $eventName argument is not declared explicitly on the
|
|
||||||
* signature of the method. Implementations that are not bound by this BC constraint
|
|
||||||
* MUST declare it explicitly, as allowed by PHP.
|
|
||||||
*
|
|
||||||
* @param object $event The event to pass to the event handlers/listeners
|
|
||||||
* @param string|null $eventName The name of the event to dispatch. If not supplied,
|
|
||||||
* the class of $event should be used instead.
|
|
||||||
*
|
|
||||||
* @return object The passed $event MUST be returned
|
|
||||||
*/
|
|
||||||
public function dispatch($event/*, string $eventName = null*/);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/**
|
require __DIR__.\DIRECTORY_SEPARATOR.'EventDispatcherInterface-psr14.php';
|
||||||
* Allows providing hooks on domain-specific lifecycles by dispatching events.
|
|
||||||
*/
|
|
||||||
interface EventDispatcherInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Dispatches an event to all registered listeners.
|
|
||||||
*
|
|
||||||
* For BC with Symfony 4, the $eventName argument is not declared explicitly on the
|
|
||||||
* signature of the method. Implementations that are not bound by this BC constraint
|
|
||||||
* MUST declare it explicitly, as allowed by PHP.
|
|
||||||
*
|
|
||||||
* @param object $event The event to pass to the event handlers/listeners
|
|
||||||
* @param string|null $eventName The name of the event to dispatch. If not supplied,
|
|
||||||
* the class of $event should be used instead.
|
|
||||||
*
|
|
||||||
* @return object The passed $event MUST be returned
|
|
||||||
*/
|
|
||||||
public function dispatch($event/*, string $eventName = null*/);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user