Merge branch '4.4' into 5.0
* 4.4: Fix more quotes in exception messages Fix more quotes in exception messages [3.4] Minor fixes [PropertyAccess] Improved errors when reading uninitialized properties
This commit is contained in:
commit
e7e5f334e7
@ -1085,7 +1085,7 @@ class FrameworkExtension extends Extension
|
|||||||
if ($container->fileExists($dir)) {
|
if ($container->fileExists($dir)) {
|
||||||
$dirs[] = $transPaths[] = $dir;
|
$dirs[] = $transPaths[] = $dir;
|
||||||
} else {
|
} else {
|
||||||
throw new \UnexpectedValueException(sprintf('%s defined in translator.paths does not exist or is not a directory.', $dir));
|
throw new \UnexpectedValueException(sprintf('"%s" defined in translator.paths does not exist or is not a directory.', $dir));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ trait RedisTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$redisClient instanceof \Redis && !$redisClient instanceof \RedisArray && !$redisClient instanceof \RedisCluster && !$redisClient instanceof \Predis\ClientInterface && !$redisClient instanceof RedisProxy && !$redisClient instanceof RedisClusterProxy) {
|
if (!$redisClient instanceof \Redis && !$redisClient instanceof \RedisArray && !$redisClient instanceof \RedisCluster && !$redisClient instanceof \Predis\ClientInterface && !$redisClient instanceof RedisProxy && !$redisClient instanceof RedisClusterProxy) {
|
||||||
throw new InvalidArgumentException(sprintf('%s() expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, \is_object($redisClient) ? \get_class($redisClient) : \gettype($redisClient)));
|
throw new InvalidArgumentException(sprintf('"%s()" expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, \is_object($redisClient) ? \get_class($redisClient) : \gettype($redisClient)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($redisClient instanceof \Predis\ClientInterface && $redisClient->getOptions()->exceptions) {
|
if ($redisClient instanceof \Predis\ClientInterface && $redisClient->getOptions()->exceptions) {
|
||||||
|
@ -319,7 +319,7 @@ final class CurlHttpClient implements HttpClientInterface, LoggerAwareInterface,
|
|||||||
if ($responses instanceof CurlResponse) {
|
if ($responses instanceof CurlResponse) {
|
||||||
$responses = [$responses];
|
$responses = [$responses];
|
||||||
} elseif (!is_iterable($responses)) {
|
} elseif (!is_iterable($responses)) {
|
||||||
throw new \TypeError(sprintf('%s() expects parameter 1 to be an iterable of CurlResponse objects, "%s" given.', __METHOD__, \is_object($responses) ? \get_class($responses) : \gettype($responses)));
|
throw new \TypeError(sprintf('"%s()" expects parameter 1 to be an iterable of CurlResponse objects, "%s" given.', __METHOD__, \is_object($responses) ? \get_class($responses) : \gettype($responses)));
|
||||||
}
|
}
|
||||||
|
|
||||||
$active = 0;
|
$active = 0;
|
||||||
|
@ -79,7 +79,7 @@ class MockHttpClient implements HttpClientInterface
|
|||||||
if ($responses instanceof ResponseInterface) {
|
if ($responses instanceof ResponseInterface) {
|
||||||
$responses = [$responses];
|
$responses = [$responses];
|
||||||
} elseif (!is_iterable($responses)) {
|
} elseif (!is_iterable($responses)) {
|
||||||
throw new \TypeError(sprintf('%s() expects parameter 1 to be an iterable of MockResponse objects, "%s" given.', __METHOD__, \is_object($responses) ? \get_class($responses) : \gettype($responses)));
|
throw new \TypeError(sprintf('"%s()" expects parameter 1 to be an iterable of MockResponse objects, "%s" given.', __METHOD__, \is_object($responses) ? \get_class($responses) : \gettype($responses)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ResponseStream(MockResponse::stream($responses, $timeout));
|
return new ResponseStream(MockResponse::stream($responses, $timeout));
|
||||||
|
@ -238,7 +238,7 @@ final class NativeHttpClient implements HttpClientInterface, LoggerAwareInterfac
|
|||||||
if ($responses instanceof NativeResponse) {
|
if ($responses instanceof NativeResponse) {
|
||||||
$responses = [$responses];
|
$responses = [$responses];
|
||||||
} elseif (!is_iterable($responses)) {
|
} elseif (!is_iterable($responses)) {
|
||||||
throw new \TypeError(sprintf('%s() expects parameter 1 to be an iterable of NativeResponse objects, "%s" given.', __METHOD__, \is_object($responses) ? \get_class($responses) : \gettype($responses)));
|
throw new \TypeError(sprintf('"%s()" expects parameter 1 to be an iterable of NativeResponse objects, "%s" given.', __METHOD__, \is_object($responses) ? \get_class($responses) : \gettype($responses)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ResponseStream(NativeResponse::stream($responses, $timeout));
|
return new ResponseStream(NativeResponse::stream($responses, $timeout));
|
||||||
|
@ -54,7 +54,7 @@ class RedisSessionHandler extends AbstractSessionHandler
|
|||||||
!$redis instanceof RedisProxy &&
|
!$redis instanceof RedisProxy &&
|
||||||
!$redis instanceof RedisClusterProxy
|
!$redis instanceof RedisClusterProxy
|
||||||
) {
|
) {
|
||||||
throw new \InvalidArgumentException(sprintf('%s() expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, \is_object($redis) ? \get_class($redis) : \gettype($redis)));
|
throw new \InvalidArgumentException(sprintf('"%s()" expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, \is_object($redis) ? \get_class($redis) : \gettype($redis)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($diff = array_diff(array_keys($options), ['prefix', 'ttl'])) {
|
if ($diff = array_diff(array_keys($options), ['prefix', 'ttl'])) {
|
||||||
|
@ -62,7 +62,7 @@ final class ArgumentResolver implements ArgumentResolverInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$atLeastOne) {
|
if (!$atLeastOne) {
|
||||||
throw new \InvalidArgumentException(sprintf('%s::resolve() must yield at least one value.', \get_class($resolver)));
|
throw new \InvalidArgumentException(sprintf('"%s::resolve()" must yield at least one value.', \get_class($resolver)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// continue to the next controller argument
|
// continue to the next controller argument
|
||||||
|
@ -360,7 +360,7 @@ abstract class NumberFormatter
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (self::CURRENCY === $this->style) {
|
if (self::CURRENCY === $this->style) {
|
||||||
throw new NotImplementedException(sprintf('%s() method does not support the formatting of currencies (instance with CURRENCY style). "%s".', __METHOD__, NotImplementedException::INTL_INSTALL_MESSAGE));
|
throw new NotImplementedException(sprintf('"%s()" method does not support the formatting of currencies (instance with CURRENCY style). "%s".', __METHOD__, NotImplementedException::INTL_INSTALL_MESSAGE));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only the default type is supported.
|
// Only the default type is supported.
|
||||||
|
@ -46,7 +46,7 @@ class MemcachedStore implements PersistingStoreInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($initialTtl < 1) {
|
if ($initialTtl < 1) {
|
||||||
throw new InvalidArgumentException(sprintf('%s() expects a strictly positive TTL. Got %d.', __METHOD__, $initialTtl));
|
throw new InvalidArgumentException(sprintf('"%s()" expects a strictly positive TTL. Got %d.', __METHOD__, $initialTtl));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->memcached = $memcached;
|
$this->memcached = $memcached;
|
||||||
@ -74,7 +74,7 @@ class MemcachedStore implements PersistingStoreInterface
|
|||||||
public function putOffExpiration(Key $key, float $ttl)
|
public function putOffExpiration(Key $key, float $ttl)
|
||||||
{
|
{
|
||||||
if ($ttl < 1) {
|
if ($ttl < 1) {
|
||||||
throw new InvalidTtlException(sprintf('%s() expects a TTL greater or equals to 1 second. Got %s.', __METHOD__, $ttl));
|
throw new InvalidTtlException(sprintf('"%s()" expects a TTL greater or equals to 1 second. Got %s.', __METHOD__, $ttl));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Interface defines a float value but Store required an integer.
|
// Interface defines a float value but Store required an integer.
|
||||||
|
@ -81,7 +81,7 @@ class PdoStore implements PersistingStoreInterface
|
|||||||
throw new InvalidArgumentException(sprintf('"%s" requires gcProbability between 0 and 1, "%f" given.', __METHOD__, $gcProbability));
|
throw new InvalidArgumentException(sprintf('"%s" requires gcProbability between 0 and 1, "%f" given.', __METHOD__, $gcProbability));
|
||||||
}
|
}
|
||||||
if ($initialTtl < 1) {
|
if ($initialTtl < 1) {
|
||||||
throw new InvalidTtlException(sprintf('%s() expects a strictly positive TTL, "%d" given.', __METHOD__, $initialTtl));
|
throw new InvalidTtlException(sprintf('"%s()" expects a strictly positive TTL, "%d" given.', __METHOD__, $initialTtl));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($connOrDsn instanceof \PDO) {
|
if ($connOrDsn instanceof \PDO) {
|
||||||
@ -146,7 +146,7 @@ class PdoStore implements PersistingStoreInterface
|
|||||||
public function putOffExpiration(Key $key, float $ttl)
|
public function putOffExpiration(Key $key, float $ttl)
|
||||||
{
|
{
|
||||||
if ($ttl < 1) {
|
if ($ttl < 1) {
|
||||||
throw new InvalidTtlException(sprintf('%s() expects a TTL greater or equals to 1 second. Got %s.', __METHOD__, $ttl));
|
throw new InvalidTtlException(sprintf('"%s()" expects a TTL greater or equals to 1 second. Got %s.', __METHOD__, $ttl));
|
||||||
}
|
}
|
||||||
|
|
||||||
$key->reduceLifetime($ttl);
|
$key->reduceLifetime($ttl);
|
||||||
|
@ -141,7 +141,7 @@ class RedisStore implements PersistingStoreInterface
|
|||||||
return $this->redis->eval(...array_merge([$script, 1, $resource], $args));
|
return $this->redis->eval(...array_merge([$script, 1, $resource], $args));
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new InvalidArgumentException(sprintf('%s() expects being initialized with a Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, \is_object($this->redis) ? \get_class($this->redis) : \gettype($this->redis)));
|
throw new InvalidArgumentException(sprintf('"%s()" expects being initialized with a Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, \is_object($this->redis) ? \get_class($this->redis) : \gettype($this->redis)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getUniqueToken(Key $key): string
|
private function getUniqueToken(Key $key): string
|
||||||
|
@ -45,7 +45,7 @@ class InputStream implements \IteratorAggregate
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($this->isClosed()) {
|
if ($this->isClosed()) {
|
||||||
throw new RuntimeException(sprintf('%s is closed.', static::class));
|
throw new RuntimeException(sprintf('"%s" is closed.', static::class));
|
||||||
}
|
}
|
||||||
$this->input[] = ProcessUtils::validateInput(__METHOD__, $input);
|
$this->input[] = ProcessUtils::validateInput(__METHOD__, $input);
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ abstract class AbstractPipes implements PipesInterface
|
|||||||
} elseif (!isset($this->inputBuffer[0])) {
|
} elseif (!isset($this->inputBuffer[0])) {
|
||||||
if (!\is_string($input)) {
|
if (!\is_string($input)) {
|
||||||
if (!is_scalar($input)) {
|
if (!is_scalar($input)) {
|
||||||
throw new InvalidArgumentException(sprintf('%s yielded a value of type "%s", but only scalars and stream resources are supported.', \get_class($this->input), \gettype($input)));
|
throw new InvalidArgumentException(sprintf('"%s" yielded a value of type "%s", but only scalars and stream resources are supported.', \get_class($this->input), \gettype($input)));
|
||||||
}
|
}
|
||||||
$input = (string) $input;
|
$input = (string) $input;
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ class ProcessUtils
|
|||||||
return new \IteratorIterator($input);
|
return new \IteratorIterator($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new InvalidArgumentException(sprintf('%s only accepts strings, Traversable objects or stream resources.', $caller));
|
throw new InvalidArgumentException(sprintf('"%s" only accepts strings, Traversable objects or stream resources.', $caller));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $input;
|
return $input;
|
||||||
|
@ -293,7 +293,7 @@ class ProcessTest extends TestCase
|
|||||||
public function testInvalidInput($value)
|
public function testInvalidInput($value)
|
||||||
{
|
{
|
||||||
$this->expectException('Symfony\Component\Process\Exception\InvalidArgumentException');
|
$this->expectException('Symfony\Component\Process\Exception\InvalidArgumentException');
|
||||||
$this->expectExceptionMessage('Symfony\Component\Process\Process::setInput only accepts strings, Traversable objects or stream resources.');
|
$this->expectExceptionMessage('"Symfony\Component\Process\Process::setInput" only accepts strings, Traversable objects or stream resources.');
|
||||||
$process = $this->getProcess('foo');
|
$process = $this->getProcess('foo');
|
||||||
$process->setInput($value);
|
$process->setInput($value);
|
||||||
}
|
}
|
||||||
|
@ -378,30 +378,50 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||||||
$object = $zval[self::VALUE];
|
$object = $zval[self::VALUE];
|
||||||
$access = $this->getReadAccessInfo(\get_class($object), $property);
|
$access = $this->getReadAccessInfo(\get_class($object), $property);
|
||||||
|
|
||||||
if (self::ACCESS_TYPE_METHOD === $access[self::ACCESS_TYPE]) {
|
try {
|
||||||
$result[self::VALUE] = $object->{$access[self::ACCESS_NAME]}();
|
if (self::ACCESS_TYPE_METHOD === $access[self::ACCESS_TYPE]) {
|
||||||
} elseif (self::ACCESS_TYPE_PROPERTY === $access[self::ACCESS_TYPE]) {
|
try {
|
||||||
$result[self::VALUE] = $object->{$access[self::ACCESS_NAME]};
|
$result[self::VALUE] = $object->{$access[self::ACCESS_NAME]}();
|
||||||
|
} catch (\TypeError $e) {
|
||||||
|
// handle uninitialized properties in PHP >= 7
|
||||||
|
if (preg_match((sprintf('/^Return value of %s::%s\(\) must be of the type (\w+), null returned$/', preg_quote(\get_class($object)), $access[self::ACCESS_NAME])), $e->getMessage(), $matches)) {
|
||||||
|
throw new AccessException(sprintf('The method "%s::%s()" returned "null", but expected type "%3$s". Have you forgotten to initialize a property or to make the return type nullable using "?%3$s" instead?', \get_class($object), $access[self::ACCESS_NAME], $matches[1]), 0, $e);
|
||||||
|
}
|
||||||
|
|
||||||
if ($access[self::ACCESS_REF] && isset($zval[self::REF])) {
|
throw $e;
|
||||||
$result[self::REF] = &$object->{$access[self::ACCESS_NAME]};
|
}
|
||||||
}
|
} elseif (self::ACCESS_TYPE_PROPERTY === $access[self::ACCESS_TYPE]) {
|
||||||
} elseif (!$access[self::ACCESS_HAS_PROPERTY] && property_exists($object, $property)) {
|
$result[self::VALUE] = $object->{$access[self::ACCESS_NAME]};
|
||||||
// Needed to support \stdClass instances. We need to explicitly
|
|
||||||
// exclude $access[self::ACCESS_HAS_PROPERTY], otherwise if
|
|
||||||
// a *protected* property was found on the class, property_exists()
|
|
||||||
// returns true, consequently the following line will result in a
|
|
||||||
// fatal error.
|
|
||||||
|
|
||||||
$result[self::VALUE] = $object->$property;
|
if ($access[self::ACCESS_REF] && isset($zval[self::REF])) {
|
||||||
if (isset($zval[self::REF])) {
|
$result[self::REF] = &$object->{$access[self::ACCESS_NAME]};
|
||||||
$result[self::REF] = &$object->$property;
|
}
|
||||||
|
} elseif (!$access[self::ACCESS_HAS_PROPERTY] && property_exists($object, $property)) {
|
||||||
|
// Needed to support \stdClass instances. We need to explicitly
|
||||||
|
// exclude $access[self::ACCESS_HAS_PROPERTY], otherwise if
|
||||||
|
// a *protected* property was found on the class, property_exists()
|
||||||
|
// returns true, consequently the following line will result in a
|
||||||
|
// fatal error.
|
||||||
|
|
||||||
|
$result[self::VALUE] = $object->$property;
|
||||||
|
if (isset($zval[self::REF])) {
|
||||||
|
$result[self::REF] = &$object->$property;
|
||||||
|
}
|
||||||
|
} elseif (self::ACCESS_TYPE_MAGIC === $access[self::ACCESS_TYPE]) {
|
||||||
|
// we call the getter and hope the __call do the job
|
||||||
|
$result[self::VALUE] = $object->{$access[self::ACCESS_NAME]}();
|
||||||
|
} elseif (!$ignoreInvalidProperty) {
|
||||||
|
throw new NoSuchPropertyException($access[self::ACCESS_NAME]);
|
||||||
}
|
}
|
||||||
} elseif (self::ACCESS_TYPE_MAGIC === $access[self::ACCESS_TYPE]) {
|
} catch (\Error $e) {
|
||||||
// we call the getter and hope the __call do the job
|
// handle uninitialized properties in PHP >= 7.4
|
||||||
$result[self::VALUE] = $object->{$access[self::ACCESS_NAME]}();
|
if (\PHP_VERSION_ID >= 70400 && preg_match('/^Typed property ([\w\\\]+)::\$(\w+) must not be accessed before initialization$/', $e->getMessage(), $matches)) {
|
||||||
} elseif (!$ignoreInvalidProperty) {
|
$r = new \ReflectionProperty($matches[1], $matches[2]);
|
||||||
throw new NoSuchPropertyException($access[self::ACCESS_NAME]);
|
|
||||||
|
throw new AccessException(sprintf('The property "%s::$%s" is not readable because it is typed "%3$s". You should either initialize it or make it nullable using "?%3$s" instead.', $r->getDeclaringClass()->getName(), $r->getName(), $r->getType()->getName()), 0, $e);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw $e;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Objects are always passed around by reference
|
// Objects are always passed around by reference
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
<?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\PropertyAccess\Tests\Fixtures;
|
||||||
|
|
||||||
|
class UninitializedPrivateProperty
|
||||||
|
{
|
||||||
|
private $uninitialized;
|
||||||
|
|
||||||
|
public function getUninitialized(): array
|
||||||
|
{
|
||||||
|
return $this->uninitialized;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
<?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\PropertyAccess\Tests\Fixtures;
|
||||||
|
|
||||||
|
class UninitializedProperty
|
||||||
|
{
|
||||||
|
public string $uninitialized;
|
||||||
|
}
|
@ -28,6 +28,8 @@ use Symfony\Component\PropertyAccess\Tests\Fixtures\TestClassTypeErrorInsideCall
|
|||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\TestSingularAndPluralProps;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\TestSingularAndPluralProps;
|
||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\Ticket5775Object;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\Ticket5775Object;
|
||||||
use Symfony\Component\PropertyAccess\Tests\Fixtures\TypeHinted;
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\TypeHinted;
|
||||||
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\UninitializedPrivateProperty;
|
||||||
|
use Symfony\Component\PropertyAccess\Tests\Fixtures\UninitializedProperty;
|
||||||
|
|
||||||
class PropertyAccessorTest extends TestCase
|
class PropertyAccessorTest extends TestCase
|
||||||
{
|
{
|
||||||
@ -131,6 +133,28 @@ class PropertyAccessorTest extends TestCase
|
|||||||
$this->propertyAccessor->getValue($objectOrArray, $path);
|
$this->propertyAccessor->getValue($objectOrArray, $path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @requires PHP 7.4
|
||||||
|
*/
|
||||||
|
public function testGetValueThrowsExceptionIfUninitializedProperty()
|
||||||
|
{
|
||||||
|
$this->expectException('Symfony\Component\PropertyAccess\Exception\AccessException');
|
||||||
|
$this->expectExceptionMessage('The property "Symfony\Component\PropertyAccess\Tests\Fixtures\UninitializedProperty::$uninitialized" is not readable because it is typed "string". You should either initialize it or make it nullable using "?string" instead.');
|
||||||
|
|
||||||
|
$this->propertyAccessor->getValue(new UninitializedProperty(), 'uninitialized');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @requires PHP 7
|
||||||
|
*/
|
||||||
|
public function testGetValueThrowsExceptionIfUninitializedPropertyWithGetter()
|
||||||
|
{
|
||||||
|
$this->expectException('Symfony\Component\PropertyAccess\Exception\AccessException');
|
||||||
|
$this->expectExceptionMessage('The method "Symfony\Component\PropertyAccess\Tests\Fixtures\UninitializedPrivateProperty::getUninitialized()" returned "null", but expected type "array". Have you forgotten to initialize a property or to make the return type nullable using "?array" instead?');
|
||||||
|
|
||||||
|
$this->propertyAccessor->getValue(new UninitializedPrivateProperty(), 'uninitialized');
|
||||||
|
}
|
||||||
|
|
||||||
public function testGetValueThrowsExceptionIfNotArrayAccess()
|
public function testGetValueThrowsExceptionIfNotArrayAccess()
|
||||||
{
|
{
|
||||||
$this->expectException('Symfony\Component\PropertyAccess\Exception\NoSuchIndexException');
|
$this->expectException('Symfony\Component\PropertyAccess\Exception\NoSuchIndexException');
|
||||||
|
@ -21,7 +21,7 @@ namespace Symfony\Component\Security\Core\User;
|
|||||||
*
|
*
|
||||||
* Regardless of how your users are loaded or where they come from (a database,
|
* Regardless of how your users are loaded or where they come from (a database,
|
||||||
* configuration, web service, etc.), you will have a class that implements
|
* configuration, web service, etc.), you will have a class that implements
|
||||||
* this interface. Objects that implement this interface are created and
|
* this interface. Objects that implement this interface are created and
|
||||||
* loaded by different objects that implement UserProviderInterface.
|
* loaded by different objects that implement UserProviderInterface.
|
||||||
*
|
*
|
||||||
* @see UserProviderInterface
|
* @see UserProviderInterface
|
||||||
|
@ -218,7 +218,7 @@ class GuardAuthenticationListener extends AbstractListener
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$response instanceof Response) {
|
if (!$response instanceof Response) {
|
||||||
throw new \LogicException(sprintf('%s::onAuthenticationSuccess *must* return a Response if you want to use the remember me functionality. Return a Response, or set remember_me to false under the guard configuration.', \get_class($guardAuthenticator)));
|
throw new \LogicException(sprintf('"%s::onAuthenticationSuccess()" *must* return a Response if you want to use the remember me functionality. Return a Response, or set remember_me to false under the guard configuration.', \get_class($guardAuthenticator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->rememberMeServices->loginSuccess($request, $response, $token);
|
$this->rememberMeServices->loginSuccess($request, $response, $token);
|
||||||
|
@ -122,7 +122,7 @@ class Data implements \ArrayAccess, \Countable, \IteratorAggregate
|
|||||||
public function getIterator()
|
public function getIterator()
|
||||||
{
|
{
|
||||||
if (!\is_array($value = $this->getValue())) {
|
if (!\is_array($value = $this->getValue())) {
|
||||||
throw new \LogicException(sprintf('%s object holds non-iterable type "%s".', self::class, \gettype($value)));
|
throw new \LogicException(sprintf('"%s" object holds non-iterable type "%s".', self::class, \gettype($value)));
|
||||||
}
|
}
|
||||||
|
|
||||||
yield from $value;
|
yield from $value;
|
||||||
|
Reference in New Issue
Block a user