diff --git a/src/Symfony/Bundle/SecurityBundle/DataCollector/SecurityDataCollector.php b/src/Symfony/Bundle/SecurityBundle/DataCollector/SecurityDataCollector.php index f0fa6790c3489..bb17d401d1032 100644 --- a/src/Symfony/Bundle/SecurityBundle/DataCollector/SecurityDataCollector.php +++ b/src/Symfony/Bundle/SecurityBundle/DataCollector/SecurityDataCollector.php @@ -20,6 +20,7 @@ use Symfony\Component\Security\Http\Logout\LogoutUrlGenerator; use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface; use Symfony\Component\Security\Core\Authorization\TraceableAccessDecisionManager; +use Symfony\Component\VarDumper\Caster\ClassStub; use Symfony\Component\VarDumper\Cloner\Data; use Symfony\Component\Security\Http\FirewallMapInterface; use Symfony\Bundle\SecurityBundle\Security\FirewallMap; @@ -36,6 +37,7 @@ class SecurityDataCollector extends DataCollector private $logoutUrlGenerator; private $accessDecisionManager; private $firewallMap; + private $hasVarDumper; /** * Constructor. @@ -53,6 +55,7 @@ public function __construct(TokenStorageInterface $tokenStorage = null, RoleHier $this->logoutUrlGenerator = $logoutUrlGenerator; $this->accessDecisionManager = $accessDecisionManager; $this->firewallMap = $firewallMap; + $this->hasVarDumper = class_exists(ClassStub::class); } /** @@ -109,28 +112,23 @@ public function collect(Request $request, Response $response, \Exception $except $this->data = array( 'enabled' => true, 'authenticated' => $token->isAuthenticated(), - 'token' => $this->cloneVar($token), - 'token_class' => get_class($token), + 'token' => $token, + 'token_class' => $this->hasVarDumper ? new ClassStub(get_class($token)) : get_class($token), 'logout_url' => $logoutUrl, 'user' => $token->getUsername(), - 'roles' => $this->cloneVar(array_map(function (RoleInterface $role) { return $role->getRole(); }, $assignedRoles)), - 'inherited_roles' => $this->cloneVar(array_map(function (RoleInterface $role) { return $role->getRole(); }, $inheritedRoles)), + 'roles' => array_map(function (RoleInterface $role) { return $role->getRole(); }, $assignedRoles), + 'inherited_roles' => array_map(function (RoleInterface $role) { return $role->getRole(); }, $inheritedRoles), 'supports_role_hierarchy' => null !== $this->roleHierarchy, ); } // collect voters and access decision manager information if ($this->accessDecisionManager instanceof TraceableAccessDecisionManager) { - $this->data['access_decision_log'] = array_map(function ($decision) { - $decision['object'] = $this->cloneVar($decision['object']); - - return $decision; - }, $this->accessDecisionManager->getDecisionLog()); - + $this->data['access_decision_log'] = $this->accessDecisionManager->getDecisionLog(); $this->data['voter_strategy'] = $this->accessDecisionManager->getStrategy(); foreach ($this->accessDecisionManager->getVoters() as $voter) { - $this->data['voters'][] = get_class($voter); + $this->data['voters'][] = $this->hasVarDumper ? new ClassStub(get_class($voter)) : get_class($voter); } } else { $this->data['access_decision_log'] = array(); @@ -155,10 +153,12 @@ public function collect(Request $request, Response $response, \Exception $except 'access_denied_handler' => $firewallConfig->getAccessDeniedHandler(), 'access_denied_url' => $firewallConfig->getAccessDeniedUrl(), 'user_checker' => $firewallConfig->getUserChecker(), - 'listeners' => $this->cloneVar($firewallConfig->getListeners()), + 'listeners' => $firewallConfig->getListeners(), ); } } + + $this->data = $this->cloneVar($this->data); } /** diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/DataCollector/SecurityDataCollectorTest.php b/src/Symfony/Bundle/SecurityBundle/Tests/DataCollector/SecurityDataCollectorTest.php index a5cd0fd1fda06..b6f1f980e45de 100644 --- a/src/Symfony/Bundle/SecurityBundle/Tests/DataCollector/SecurityDataCollectorTest.php +++ b/src/Symfony/Bundle/SecurityBundle/Tests/DataCollector/SecurityDataCollectorTest.php @@ -66,14 +66,10 @@ public function testCollectAuthenticationTokenAndRoles(array $roles, array $norm $this->assertTrue($collector->isEnabled()); $this->assertTrue($collector->isAuthenticated()); - $this->assertSame('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken', $collector->getTokenClass()); + $this->assertSame('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken', $collector->getTokenClass()->getValue()); $this->assertTrue($collector->supportsRoleHierarchy()); - $this->assertSame($normalizedRoles, $collector->getRoles()->getRawData()[1]); - if ($inheritedRoles) { - $this->assertSame($inheritedRoles, $collector->getInheritedRoles()->getRawData()[1]); - } else { - $this->assertSame($inheritedRoles, $collector->getInheritedRoles()->getRawData()[0][0]); - } + $this->assertSame($normalizedRoles, $collector->getRoles()->getValue(true)); + $this->assertSame($inheritedRoles, $collector->getInheritedRoles()->getValue(true)); $this->assertSame('hhamon', $collector->getUser()); } @@ -107,7 +103,7 @@ public function testGetFirewall() $this->assertSame($firewallConfig->getAccessDeniedHandler(), $collected['access_denied_handler']); $this->assertSame($firewallConfig->getAccessDeniedUrl(), $collected['access_denied_url']); $this->assertSame($firewallConfig->getUserChecker(), $collected['user_checker']); - $this->assertSame($firewallConfig->getListeners(), $collected['listeners']->getRawData()[0][0]); + $this->assertSame($firewallConfig->getListeners(), $collected['listeners']->getValue()); } public function testGetFirewallReturnsNull() diff --git a/src/Symfony/Bundle/SecurityBundle/composer.json b/src/Symfony/Bundle/SecurityBundle/composer.json index 337d5fb82624f..ae1bb02f72e55 100644 --- a/src/Symfony/Bundle/SecurityBundle/composer.json +++ b/src/Symfony/Bundle/SecurityBundle/composer.json @@ -19,7 +19,7 @@ "php": ">=5.5.9", "symfony/security": "~3.3", "symfony/dependency-injection": "~3.3", - "symfony/http-kernel": "~3.2", + "symfony/http-kernel": "~3.3", "symfony/polyfill-php70": "~1.0" }, "require-dev": { @@ -37,12 +37,15 @@ "symfony/twig-bridge": "~2.8|~3.0", "symfony/process": "~2.8|~3.0", "symfony/validator": "^3.2.5", - "symfony/var-dumper": "~3.2", + "symfony/var-dumper": "~3.3", "symfony/yaml": "~2.8|~3.0", "symfony/expression-language": "~2.8|~3.0", "doctrine/doctrine-bundle": "~1.4", "twig/twig": "~1.28|~2.0" }, + "conflict": { + "symfony/var-dumper": "<3.3" + }, "suggest": { "symfony/security-acl": "For using the ACL functionality of this bundle" }, diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/cache.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/cache.html.twig index 3f52d643a2bc0..c71a69181736c 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/cache.html.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/cache.html.twig @@ -90,7 +90,7 @@
+ * + * @final */ class Caster { @@ -38,14 +40,20 @@ class Caster /** * Casts objects to arrays and adds the dynamic property prefix. * - * @param object $obj The object to cast - * @param \ReflectionClass $reflector The class reflector to use for inspecting the object definition + * @param object $obj The object to cast + * @param string $class The class of the object + * @param bool $hasDebugInfo Whether the __debugInfo method exists on $obj or not * * @return array The array-cast of the object, with prefixed dynamic properties */ - public static function castObject($obj, \ReflectionClass $reflector) + public static function castObject($obj, $class, $hasDebugInfo = false) { - if ($reflector->hasMethod('__debugInfo')) { + if ($class instanceof \ReflectionClass) { + @trigger_error(sprintf('Passing a ReflectionClass to %s() is deprecated since version 3.3 and will be unsupported in 4.0. Pass the class name as string instead.', __METHOD__), E_USER_DEPRECATED); + $hasDebugInfo = $class->hasMethod('__debugInfo'); + $class = $class->name; + } + if ($hasDebugInfo) { $a = $obj->__debugInfo(); } elseif ($obj instanceof \Closure) { $a = array(); @@ -57,19 +65,22 @@ public static function castObject($obj, \ReflectionClass $reflector) } if ($a) { - $combine = false; - $p = array_keys($a); - foreach ($p as $i => $k) { - if (isset($k[0]) && "\0" !== $k[0] && !$reflector->hasProperty($k)) { - $combine = true; - $p[$i] = self::PREFIX_DYNAMIC.$k; + $i = 0; + $prefixedKeys = array(); + foreach ($a as $k => $v) { + if (isset($k[0]) && "\0" !== $k[0] && !property_exists($class, $k)) { + $prefixedKeys[$i] = self::PREFIX_DYNAMIC.$k; } elseif (isset($k[16]) && "\0" === $k[16] && 0 === strpos($k, "\0class@anonymous\0")) { - $combine = true; - $p[$i] = "\0".$reflector->getParentClass().'@anonymous'.strrchr($k, "\0"); + $prefixedKeys[$i] = "\0".get_parent_class($class).'@anonymous'.strrchr($k, "\0"); } + ++$i; } - if ($combine) { - $a = array_combine($p, $a); + if ($prefixedKeys) { + $keys = array_keys($a); + foreach ($prefixedKeys as $i => $k) { + $keys[$i] = $k; + } + $a = array_combine($keys, $a); } } diff --git a/src/Symfony/Component/VarDumper/Caster/ExceptionCaster.php b/src/Symfony/Component/VarDumper/Caster/ExceptionCaster.php index aa32d8b90bb98..8069d88454f89 100644 --- a/src/Symfony/Component/VarDumper/Caster/ExceptionCaster.php +++ b/src/Symfony/Component/VarDumper/Caster/ExceptionCaster.php @@ -70,7 +70,7 @@ public static function castThrowingCasterException(ThrowingCasterException $e, a if (isset($a[$xPrefix.'previous'], $a[$xPrefix.'trace'])) { $b = (array) $a[$xPrefix.'previous']; self::traceUnshift($b[$xPrefix.'trace'], get_class($a[$xPrefix.'previous']), $b[$prefix.'file'], $b[$prefix.'line']); - $a[$xPrefix.'trace'] = new TraceStub($b[$xPrefix.'trace'], false, 0, -1 - count($a[$xPrefix.'trace']->value)); + $a[$xPrefix.'trace'] = new TraceStub($b[$xPrefix.'trace'], false, 0, -count($a[$xPrefix.'trace']->value)); } unset($a[$xPrefix.'previous'], $a[$prefix.'code'], $a[$prefix.'file'], $a[$prefix.'line']); diff --git a/src/Symfony/Component/VarDumper/Caster/ReflectionCaster.php b/src/Symfony/Component/VarDumper/Caster/ReflectionCaster.php index dcb5a2f29ca34..9811eab5e7e48 100644 --- a/src/Symfony/Component/VarDumper/Caster/ReflectionCaster.php +++ b/src/Symfony/Component/VarDumper/Caster/ReflectionCaster.php @@ -31,13 +31,13 @@ class ReflectionCaster 'isVariadic' => 'isVariadic', ); - public static function castClosure(\Closure $c, array $a, Stub $stub, $isNested) + public static function castClosure(\Closure $c, array $a, Stub $stub, $isNested, $filter = 0) { $prefix = Caster::PREFIX_VIRTUAL; $c = new \ReflectionFunction($c); $stub->class = 'Closure'; // HHVM generates unique class names for closures - $a = static::castFunctionAbstract($c, $a, $stub, $isNested); + $a = static::castFunctionAbstract($c, $a, $stub, $isNested, $filter); if (isset($a[$prefix.'parameters'])) { foreach ($a[$prefix.'parameters']->value as &$v) { @@ -51,8 +51,9 @@ public static function castClosure(\Closure $c, array $a, Stub $stub, $isNested) unset($v->value['position'], $v->value['isVariadic'], $v->value['byReference'], $v); } } + ; - if ($f = $c->getFileName()) { + if (!($filter & Caster::EXCLUDE_VERBOSE) && $f = $c->getFileName()) { $a[$prefix.'file'] = new LinkStub($f, $c->getStartLine()); $a[$prefix.'line'] = $c->getStartLine().' to '.$c->getEndLine(); } @@ -199,7 +200,11 @@ public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, arra if ($v = $c->getStaticVariables()) { foreach ($v as $k => &$v) { - $a[$prefix.'use']['$'.$k] = &$v; + if (is_object($v)) { + $a[$prefix.'use']['$'.$k] = new CutStub($v); + } else { + $a[$prefix.'use']['$'.$k] = &$v; + } } unset($v); $a[$prefix.'use'] = new EnumStub($a[$prefix.'use']); diff --git a/src/Symfony/Component/VarDumper/Caster/SplCaster.php b/src/Symfony/Component/VarDumper/Caster/SplCaster.php index 2c676957584d6..cbeb679543651 100644 --- a/src/Symfony/Component/VarDumper/Caster/SplCaster.php +++ b/src/Symfony/Component/VarDumper/Caster/SplCaster.php @@ -45,7 +45,7 @@ public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, $i } else { if (!($flags & \ArrayObject::STD_PROP_LIST)) { $c->setFlags(\ArrayObject::STD_PROP_LIST); - $a = Caster::castObject($c, new \ReflectionClass($class)); + $a = Caster::castObject($c, $class); $c->setFlags($flags); } diff --git a/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php b/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php index b185c96fab636..57285717f3732 100644 --- a/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php +++ b/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php @@ -22,107 +22,107 @@ abstract class AbstractCloner implements ClonerInterface { public static $defaultCasters = array( - '__PHP_Incomplete_Class' => 'Symfony\Component\VarDumper\Caster\Caster::castPhpIncompleteClass', - - 'Symfony\Component\VarDumper\Caster\CutStub' => 'Symfony\Component\VarDumper\Caster\StubCaster::castStub', - 'Symfony\Component\VarDumper\Caster\CutArrayStub' => 'Symfony\Component\VarDumper\Caster\StubCaster::castCutArray', - 'Symfony\Component\VarDumper\Caster\ConstStub' => 'Symfony\Component\VarDumper\Caster\StubCaster::castStub', - 'Symfony\Component\VarDumper\Caster\EnumStub' => 'Symfony\Component\VarDumper\Caster\StubCaster::castEnum', - - 'Closure' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castClosure', - 'Generator' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castGenerator', - 'ReflectionType' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castType', - 'ReflectionGenerator' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castReflectionGenerator', - 'ReflectionClass' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castClass', - 'ReflectionFunctionAbstract' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castFunctionAbstract', - 'ReflectionMethod' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castMethod', - 'ReflectionParameter' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castParameter', - 'ReflectionProperty' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castProperty', - 'ReflectionExtension' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castExtension', - 'ReflectionZendExtension' => 'Symfony\Component\VarDumper\Caster\ReflectionCaster::castZendExtension', - - 'Doctrine\Common\Persistence\ObjectManager' => 'Symfony\Component\VarDumper\Caster\StubCaster::cutInternals', - 'Doctrine\Common\Proxy\Proxy' => 'Symfony\Component\VarDumper\Caster\DoctrineCaster::castCommonProxy', - 'Doctrine\ORM\Proxy\Proxy' => 'Symfony\Component\VarDumper\Caster\DoctrineCaster::castOrmProxy', - 'Doctrine\ORM\PersistentCollection' => 'Symfony\Component\VarDumper\Caster\DoctrineCaster::castPersistentCollection', - - 'DOMException' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castException', - 'DOMStringList' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castLength', - 'DOMNameList' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castLength', - 'DOMImplementation' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castImplementation', - 'DOMImplementationList' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castLength', - 'DOMNode' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castNode', - 'DOMNameSpaceNode' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castNameSpaceNode', - 'DOMDocument' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castDocument', - 'DOMNodeList' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castLength', - 'DOMNamedNodeMap' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castLength', - 'DOMCharacterData' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castCharacterData', - 'DOMAttr' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castAttr', - 'DOMElement' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castElement', - 'DOMText' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castText', - 'DOMTypeinfo' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castTypeinfo', - 'DOMDomError' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castDomError', - 'DOMLocator' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castLocator', - 'DOMDocumentType' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castDocumentType', - 'DOMNotation' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castNotation', - 'DOMEntity' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castEntity', - 'DOMProcessingInstruction' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castProcessingInstruction', - 'DOMXPath' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castXPath', - - 'XmlReader' => 'Symfony\Component\VarDumper\Caster\XmlReaderCaster::castXmlReader', - - 'ErrorException' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castErrorException', - 'Exception' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castException', - 'Error' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castError', - 'Symfony\Component\DependencyInjection\ContainerInterface' => 'Symfony\Component\VarDumper\Caster\StubCaster::cutInternals', - 'Symfony\Component\DependencyInjection\LazyProxy\InheritanceProxyInterface' => 'Symfony\Component\VarDumper\Caster\SymfonyCaster::castInheritanceProxy', - 'Symfony\Component\HttpFoundation\Request' => 'Symfony\Component\VarDumper\Caster\SymfonyCaster::castRequest', - '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\FrameStub' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castFrameStub', - - 'PHPUnit_Framework_MockObject_MockObject' => 'Symfony\Component\VarDumper\Caster\StubCaster::cutInternals', - 'Prophecy\Prophecy\ProphecySubjectInterface' => 'Symfony\Component\VarDumper\Caster\StubCaster::cutInternals', - 'Mockery\MockInterface' => 'Symfony\Component\VarDumper\Caster\StubCaster::cutInternals', - - 'PDO' => 'Symfony\Component\VarDumper\Caster\PdoCaster::castPdo', - 'PDOStatement' => 'Symfony\Component\VarDumper\Caster\PdoCaster::castPdoStatement', - - 'AMQPConnection' => 'Symfony\Component\VarDumper\Caster\AmqpCaster::castConnection', - 'AMQPChannel' => 'Symfony\Component\VarDumper\Caster\AmqpCaster::castChannel', - 'AMQPQueue' => 'Symfony\Component\VarDumper\Caster\AmqpCaster::castQueue', - 'AMQPExchange' => 'Symfony\Component\VarDumper\Caster\AmqpCaster::castExchange', - 'AMQPEnvelope' => 'Symfony\Component\VarDumper\Caster\AmqpCaster::castEnvelope', - - 'ArrayObject' => 'Symfony\Component\VarDumper\Caster\SplCaster::castArrayObject', - 'SplDoublyLinkedList' => 'Symfony\Component\VarDumper\Caster\SplCaster::castDoublyLinkedList', - 'SplFileInfo' => 'Symfony\Component\VarDumper\Caster\SplCaster::castFileInfo', - 'SplFileObject' => 'Symfony\Component\VarDumper\Caster\SplCaster::castFileObject', - 'SplFixedArray' => 'Symfony\Component\VarDumper\Caster\SplCaster::castFixedArray', - 'SplHeap' => 'Symfony\Component\VarDumper\Caster\SplCaster::castHeap', - 'SplObjectStorage' => 'Symfony\Component\VarDumper\Caster\SplCaster::castObjectStorage', - 'SplPriorityQueue' => 'Symfony\Component\VarDumper\Caster\SplCaster::castHeap', - 'OuterIterator' => 'Symfony\Component\VarDumper\Caster\SplCaster::castOuterIterator', - - 'MongoCursorInterface' => 'Symfony\Component\VarDumper\Caster\MongoCaster::castCursor', - - 'Redis' => 'Symfony\Component\VarDumper\Caster\RedisCaster::castRedis', - 'RedisArray' => 'Symfony\Component\VarDumper\Caster\RedisCaster::castRedisArray', - - ':curl' => 'Symfony\Component\VarDumper\Caster\ResourceCaster::castCurl', - ':dba' => 'Symfony\Component\VarDumper\Caster\ResourceCaster::castDba', - ':dba persistent' => 'Symfony\Component\VarDumper\Caster\ResourceCaster::castDba', - ':gd' => 'Symfony\Component\VarDumper\Caster\ResourceCaster::castGd', - ':mysql link' => 'Symfony\Component\VarDumper\Caster\ResourceCaster::castMysqlLink', - ':pgsql large object' => 'Symfony\Component\VarDumper\Caster\PgSqlCaster::castLargeObject', - ':pgsql link' => 'Symfony\Component\VarDumper\Caster\PgSqlCaster::castLink', - ':pgsql link persistent' => 'Symfony\Component\VarDumper\Caster\PgSqlCaster::castLink', - ':pgsql result' => 'Symfony\Component\VarDumper\Caster\PgSqlCaster::castResult', - ':process' => 'Symfony\Component\VarDumper\Caster\ResourceCaster::castProcess', - ':stream' => 'Symfony\Component\VarDumper\Caster\ResourceCaster::castStream', - ':persistent stream' => 'Symfony\Component\VarDumper\Caster\ResourceCaster::castStream', - ':stream-context' => 'Symfony\Component\VarDumper\Caster\ResourceCaster::castStreamContext', - ':xml' => 'Symfony\Component\VarDumper\Caster\XmlResourceCaster::castXml', + '__PHP_Incomplete_Class' => array('Symfony\Component\VarDumper\Caster\Caster', 'castPhpIncompleteClass'), + + 'Symfony\Component\VarDumper\Caster\CutStub' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'), + 'Symfony\Component\VarDumper\Caster\CutArrayStub' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'castCutArray'), + 'Symfony\Component\VarDumper\Caster\ConstStub' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'), + 'Symfony\Component\VarDumper\Caster\EnumStub' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'castEnum'), + + 'Closure' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClosure'), + 'Generator' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castGenerator'), + 'ReflectionType' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castType'), + 'ReflectionGenerator' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReflectionGenerator'), + 'ReflectionClass' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClass'), + 'ReflectionFunctionAbstract' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castFunctionAbstract'), + 'ReflectionMethod' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castMethod'), + 'ReflectionParameter' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castParameter'), + 'ReflectionProperty' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castProperty'), + 'ReflectionExtension' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castExtension'), + 'ReflectionZendExtension' => array('Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castZendExtension'), + + 'Doctrine\Common\Persistence\ObjectManager' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'), + 'Doctrine\Common\Proxy\Proxy' => array('Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castCommonProxy'), + 'Doctrine\ORM\Proxy\Proxy' => array('Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castOrmProxy'), + 'Doctrine\ORM\PersistentCollection' => array('Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castPersistentCollection'), + + 'DOMException' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'), + 'DOMStringList' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'), + 'DOMNameList' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'), + 'DOMImplementation' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'), + 'DOMImplementationList' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'), + 'DOMNode' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castNode'), + 'DOMNameSpaceNode' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castNameSpaceNode'), + 'DOMDocument' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocument'), + 'DOMNodeList' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'), + 'DOMNamedNodeMap' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'), + 'DOMCharacterData' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castCharacterData'), + 'DOMAttr' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castAttr'), + 'DOMElement' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castElement'), + 'DOMText' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castText'), + 'DOMTypeinfo' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castTypeinfo'), + 'DOMDomError' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castDomError'), + 'DOMLocator' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castLocator'), + 'DOMDocumentType' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocumentType'), + 'DOMNotation' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castNotation'), + 'DOMEntity' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castEntity'), + 'DOMProcessingInstruction' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castProcessingInstruction'), + 'DOMXPath' => array('Symfony\Component\VarDumper\Caster\DOMCaster', 'castXPath'), + + 'XmlReader' => array('Symfony\Component\VarDumper\Caster\XmlReaderCaster', 'castXmlReader'), + + 'ErrorException' => array('Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castErrorException'), + 'Exception' => array('Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castException'), + 'Error' => array('Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castError'), + 'Symfony\Component\DependencyInjection\ContainerInterface' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'), + 'Symfony\Component\DependencyInjection\LazyProxy\InheritanceProxyInterface' => array('Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castInheritanceProxy'), + 'Symfony\Component\HttpFoundation\Request' => array('Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castRequest'), + 'Symfony\Component\VarDumper\Exception\ThrowingCasterException' => array('Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castThrowingCasterException'), + 'Symfony\Component\VarDumper\Caster\TraceStub' => array('Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'), + 'Symfony\Component\VarDumper\Caster\FrameStub' => array('Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFrameStub'), + + 'PHPUnit_Framework_MockObject_MockObject' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'), + 'Prophecy\Prophecy\ProphecySubjectInterface' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'), + 'Mockery\MockInterface' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'), + + 'PDO' => array('Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdo'), + 'PDOStatement' => array('Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdoStatement'), + + 'AMQPConnection' => array('Symfony\Component\VarDumper\Caster\AmqpCaster', 'castConnection'), + 'AMQPChannel' => array('Symfony\Component\VarDumper\Caster\AmqpCaster', 'castChannel'), + 'AMQPQueue' => array('Symfony\Component\VarDumper\Caster\AmqpCaster', 'castQueue'), + 'AMQPExchange' => array('Symfony\Component\VarDumper\Caster\AmqpCaster', 'castExchange'), + 'AMQPEnvelope' => array('Symfony\Component\VarDumper\Caster\AmqpCaster', 'castEnvelope'), + + 'ArrayObject' => array('Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayObject'), + 'SplDoublyLinkedList' => array('Symfony\Component\VarDumper\Caster\SplCaster', 'castDoublyLinkedList'), + 'SplFileInfo' => array('Symfony\Component\VarDumper\Caster\SplCaster', 'castFileInfo'), + 'SplFileObject' => array('Symfony\Component\VarDumper\Caster\SplCaster', 'castFileObject'), + 'SplFixedArray' => array('Symfony\Component\VarDumper\Caster\SplCaster', 'castFixedArray'), + 'SplHeap' => array('Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'), + 'SplObjectStorage' => array('Symfony\Component\VarDumper\Caster\SplCaster', 'castObjectStorage'), + 'SplPriorityQueue' => array('Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'), + 'OuterIterator' => array('Symfony\Component\VarDumper\Caster\SplCaster', 'castOuterIterator'), + + 'MongoCursorInterface' => array('Symfony\Component\VarDumper\Caster\MongoCaster', 'castCursor'), + + 'Redis' => array('Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'), + 'RedisArray' => array('Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisArray'), + + ':curl' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'), + ':dba' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'), + ':dba persistent' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'), + ':gd' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castGd'), + ':mysql link' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castMysqlLink'), + ':pgsql large object' => array('Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLargeObject'), + ':pgsql link' => array('Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'), + ':pgsql link persistent' => array('Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'), + ':pgsql result' => array('Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castResult'), + ':process' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castProcess'), + ':stream' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'), + ':persistent stream' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'), + ':stream-context' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStreamContext'), + ':xml' => array('Symfony\Component\VarDumper\Caster\XmlResourceCaster', 'castXml'), ); protected $maxItems = 2500; @@ -161,7 +161,7 @@ public function __construct(array $casters = null) public function addCasters(array $casters) { foreach ($casters as $type => $callback) { - $this->casters[strtolower($type)][] = $callback; + $this->casters[strtolower($type)][] = is_string($callback) && false !== strpos($callback, '::') ? explode('::', $callback, 2) : $callback; } } @@ -249,25 +249,37 @@ protected function castObject(Stub $stub, $isNested) $stub->class = get_parent_class($class).'@anonymous'; } if (isset($this->classInfo[$class])) { - $classInfo = $this->classInfo[$class]; + list($i, $parents, $hasDebugInfo) = $this->classInfo[$class]; } else { - $classInfo = array( - new \ReflectionClass($class), - array_reverse(array($class => $class) + class_parents($class) + class_implements($class) + array('*' => '*')), - ); - $classInfo[1] = array_map('strtolower', $classInfo[1]); + $i = 2; + $parents = array(strtolower($class)); + $hasDebugInfo = method_exists($class, '__debugInfo'); - $this->classInfo[$class] = $classInfo; + foreach (class_parents($class) as $p) { + $parents[] = strtolower($p); + ++$i; + } + foreach (class_implements($class) as $p) { + $parents[] = strtolower($p); + ++$i; + } + $parents[] = '*'; + + $this->classInfo[$class] = array($i, $parents, $hasDebugInfo); } - $a = Caster::castObject($obj, $classInfo[0]); + $a = Caster::castObject($obj, $class, $hasDebugInfo); - foreach ($classInfo[1] as $p) { - if (!empty($this->casters[$p])) { - foreach ($this->casters[$p] as $p) { - $a = $this->callCaster($p, $obj, $a, $stub, $isNested); + try { + while ($i--) { + if (!empty($this->casters[$p = $parents[$i]])) { + foreach ($this->casters[$p] as $callback) { + $a = $callback($obj, $a, $stub, $isNested, $this->filter); + } } } + } catch (\Exception $e) { + $a = array((Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)) + $a; } return $a; @@ -287,33 +299,11 @@ protected function castResource(Stub $stub, $isNested) $res = $stub->value; $type = $stub->class; - if (!empty($this->casters[':'.$type])) { - foreach ($this->casters[':'.$type] as $c) { - $a = $this->callCaster($c, $res, $a, $stub, $isNested); - } - } - - return $a; - } - - /** - * Calls a custom caster. - * - * @param callable $callback The caster - * @param object|resource $obj The object/resource being casted - * @param array $a The result of the previous cast for chained casters - * @param Stub $stub The Stub for the casted object/resource - * @param bool $isNested True if $obj is nested in the dumped structure - * - * @return array The casted object/resource - */ - private function callCaster($callback, $obj, $a, $stub, $isNested) - { try { - $cast = call_user_func($callback, $obj, $a, $stub, $isNested, $this->filter); - - if (is_array($cast)) { - $a = $cast; + if (!empty($this->casters[':'.$type])) { + foreach ($this->casters[':'.$type] as $callback) { + $a = $callback($res, $a, $stub, $isNested, $this->filter); + } } } catch (\Exception $e) { $a = array((Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)) + $a; diff --git a/src/Symfony/Component/VarDumper/Cloner/Data.php b/src/Symfony/Component/VarDumper/Cloner/Data.php index 22fd2fd1a4a28..5a6997cf251cb 100644 --- a/src/Symfony/Component/VarDumper/Cloner/Data.php +++ b/src/Symfony/Component/VarDumper/Cloner/Data.php @@ -16,7 +16,7 @@ /** * @author Nicolas Grekas
*/
-class Data
+class Data implements \ArrayAccess, \Countable, \IteratorAggregate
{
private $data;
private $position = 0;
@@ -33,11 +33,147 @@ public function __construct(array $data)
$this->data = $data;
}
+ /**
+ * @return string The type of the value.
+ */
+ public function getType()
+ {
+ $item = $this->data[$this->position][$this->key];
+
+ if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) {
+ $item = $item->value;
+ }
+ if (!$item instanceof Stub) {
+ return gettype($item);
+ }
+ if (Stub::TYPE_STRING === $item->type) {
+ return 'string';
+ }
+ if (Stub::TYPE_ARRAY === $item->type) {
+ return 'array';
+ }
+ if (Stub::TYPE_OBJECT === $item->type) {
+ return $item->class;
+ }
+ if (Stub::TYPE_RESOURCE === $item->type) {
+ return $item->class.' resource';
+ }
+ }
+
+ /**
+ * @param bool $recursive Whether values should be resolved recursively or not.
+ *
+ * @return scalar|array|null|Data[] A native representation of the original value.
+ */
+ public function getValue($recursive = false)
+ {
+ $item = $this->data[$this->position][$this->key];
+
+ if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) {
+ $item = $item->value;
+ }
+ if (!$item instanceof Stub) {
+ return $item;
+ }
+ if (Stub::TYPE_STRING === $item->type) {
+ return $item->value;
+ }
+
+ $children = $item->position ? $this->data[$item->position] : array();
+
+ foreach ($children as $k => $v) {
+ if ($recursive && !$v instanceof Stub) {
+ continue;
+ }
+ $children[$k] = clone $this;
+ $children[$k]->key = $k;
+ $children[$k]->position = $item->position;
+
+ if ($recursive) {
+ if ($v instanceof Stub && Stub::TYPE_REF === $v->type && $v->value instanceof Stub) {
+ $recursive = (array) $recursive;
+ if (isset($recursive[$v->value->position])) {
+ continue;
+ }
+ $recursive[$v->value->position] = true;
+ }
+ $children[$k] = $children[$k]->getValue($recursive);
+ }
+ }
+
+ return $children;
+ }
+
+ public function count()
+ {
+ return count($this->getValue());
+ }
+
+ public function getIterator()
+ {
+ if (!is_array($value = $this->getValue())) {
+ throw new \LogicException(sprintf('%s object holds non-iterable type "%s".', self::class, gettype($value)));
+ }
+
+ foreach ($value as $k => $v) {
+ yield $k => $v;
+ }
+ }
+
+ public function __get($key)
+ {
+ if (null !== $data = $this->seek($key)) {
+ $item = $data->data[$data->position][$data->key];
+
+ return $item instanceof Stub || array() === $item ? $data : $item;
+ }
+ }
+
+ public function __isset($key)
+ {
+ return null !== $this->seek($key);
+ }
+
+ public function offsetExists($key)
+ {
+ return $this->__isset($key);
+ }
+
+ public function offsetGet($key)
+ {
+ return $this->__get($key);
+ }
+
+ public function offsetSet($key, $value)
+ {
+ throw new \BadMethodCallException(self::class.' objects are immutable.');
+ }
+
+ public function offsetUnset($key)
+ {
+ throw new \BadMethodCallException(self::class.' objects are immutable.');
+ }
+
+ public function __toString()
+ {
+ $value = $this->getValue();
+
+ if (!is_array($value)) {
+ return (string) $value;
+ }
+
+ return sprintf('%s (count=%d)', $this->getType(), count($value));
+ }
+
/**
* @return array The raw data structure
+ *
+ * @deprecated since version 3.3. Use array or object access instead.
*/
public function getRawData()
{
+ @trigger_error(sprintf('The %s() method is deprecated since version 3.3 and will be removed in 4.0. Use the array or object access instead.', __METHOD__));
+
return $this->data;
}
@@ -97,6 +233,9 @@ public function seek($key)
{
$item = $this->data[$this->position][$this->key];
+ if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) {
+ $item = $item->value;
+ }
if (!$item instanceof Stub || !$item->position) {
return;
}
diff --git a/src/Symfony/Component/VarDumper/Tests/Cloner/DataTest.php b/src/Symfony/Component/VarDumper/Tests/Cloner/DataTest.php
new file mode 100644
index 0000000000000..83f6b60074250
--- /dev/null
+++ b/src/Symfony/Component/VarDumper/Tests/Cloner/DataTest.php
@@ -0,0 +1,115 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Tests\Cloner;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\VarDumper\Caster\Caster;
+use Symfony\Component\VarDumper\Caster\ClassStub;
+use Symfony\Component\VarDumper\Cloner\Data;
+use Symfony\Component\VarDumper\Cloner\VarCloner;
+
+class DataTest extends TestCase
+{
+ public function testBasicData()
+ {
+ $values = array(1 => 123, 4.5, 'abc', null, false);
+ $data = $this->cloneVar($values);
+ $clonedValues = array();
+
+ $this->assertInstanceOf(Data::class, $data);
+ $this->assertCount(count($values), $data);
+ $this->assertFalse(isset($data->{0}));
+ $this->assertFalse(isset($data[0]));
+
+ foreach ($data as $k => $v) {
+ $this->assertTrue(isset($data->{$k}));
+ $this->assertTrue(isset($data[$k]));
+ $this->assertSame(gettype($values[$k]), $data->seek($k)->getType());
+ $this->assertSame($values[$k], $data->seek($k)->getValue());
+ $this->assertSame($values[$k], $data->{$k});
+ $this->assertSame($values[$k], $data[$k]);
+ $this->assertSame((string) $values[$k], (string) $data->seek($k));
+
+ $clonedValues[$k] = $v->getValue();
+ }
+
+ $this->assertSame($values, $clonedValues);
+ }
+
+ public function testObject()
+ {
+ $data = $this->cloneVar(new \Exception('foo'));
+
+ $this->assertSame('Exception', $data->getType());
+
+ $this->assertSame('foo', $data->message);
+ $this->assertSame('foo', $data->{Caster::PREFIX_PROTECTED.'message'});
+
+ $this->assertSame('foo', $data['message']);
+ $this->assertSame('foo', $data[Caster::PREFIX_PROTECTED.'message']);
+
+ $this->assertStringMatchesFormat('Exception (count=%d)', (string) $data);
+ }
+
+ public function testArray()
+ {
+ $values = array(array(), array(123));
+ $data = $this->cloneVar($values);
+
+ $this->assertSame($values, $data->getValue(true));
+
+ $children = $data->getValue();
+
+ $this->assertInternalType('array', $children);
+
+ $this->assertInstanceOf(Data::class, $children[0]);
+ $this->assertInstanceOf(Data::class, $children[1]);
+
+ $this->assertEquals($children[0], $data[0]);
+ $this->assertEquals($children[1], $data[1]);
+
+ $this->assertSame($values[0], $children[0]->getValue(true));
+ $this->assertSame($values[1], $children[1]->getValue(true));
+ }
+
+ public function testStub()
+ {
+ $data = $this->cloneVar(array(new ClassStub('stdClass')));
+ $data = $data[0];
+
+ $this->assertSame('string', $data->getType());
+ $this->assertSame('stdClass', $data->getValue());
+ $this->assertSame('stdClass', (string) $data);
+ }
+
+ public function testHardRefs()
+ {
+ $values = array(array());
+ $values[1] = &$values[0];
+ $values[2][0] = &$values[2];
+
+ $data = $this->cloneVar($values);
+
+ $this->assertSame(array(), $data[0]->getValue());
+ $this->assertSame(array(), $data[1]->getValue());
+ $this->assertEquals(array($data[2]->getValue()), $data[2]->getValue(true));
+
+ $this->assertSame('array (count=3)', (string) $data);
+ }
+
+ private function cloneVar($value)
+ {
+ $cloner = new VarCloner();
+
+ return $cloner->cloneVar($value);
+ }
+}
diff --git a/src/Symfony/Component/VarDumper/Tests/VarClonerTest.php b/src/Symfony/Component/VarDumper/Tests/Cloner/VarClonerTest.php
similarity index 99%
rename from src/Symfony/Component/VarDumper/Tests/VarClonerTest.php
rename to src/Symfony/Component/VarDumper/Tests/Cloner/VarClonerTest.php
index 273be61121bce..75774170f32ee 100644
--- a/src/Symfony/Component/VarDumper/Tests/VarClonerTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Cloner/VarClonerTest.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\VarDumper\Tests;
+namespace Symfony\Component\VarDumper\Tests\Cloner;
use PHPUnit\Framework\TestCase;
use Symfony\Component\VarDumper\Cloner\VarCloner;
diff --git a/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php b/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php
similarity index 97%
rename from src/Symfony/Component/VarDumper/Tests/CliDumperTest.php
rename to src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php
index b06fe3e9e1858..638570c3db35e 100644
--- a/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\VarDumper\Tests;
+namespace Symfony\Component\VarDumper\Tests\Dumper;
use PHPUnit\Framework\TestCase;
use Symfony\Component\VarDumper\Cloner\VarCloner;
@@ -25,7 +25,7 @@ class CliDumperTest extends TestCase
public function testGet()
{
- require __DIR__.'/Fixtures/dumb-var.php';
+ require __DIR__.'/../Fixtures/dumb-var.php';
$dumper = new CliDumper('php://output');
$dumper->setColors(false);
@@ -75,8 +75,8 @@ public function testGet()
+"bar": "bar"
}
"closure" => Closure {{$r}
- class: "Symfony\Component\VarDumper\Tests\CliDumperTest"
- this: Symfony\Component\VarDumper\Tests\CliDumperTest {{$r} …}
+ class: "Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest"
+ this: Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest {{$r} …}
parameters: {
\$a: {}
&\$b: {
@@ -297,7 +297,7 @@ public function testThrowingCaster()
{
$out = fopen('php://memory', 'r+b');
- require_once __DIR__.'/Fixtures/Twig.php';
+ require_once __DIR__.'/../Fixtures/Twig.php';
$twig = new \__TwigTemplate_VarDumperFixture_u75a09(new \Twig_Environment(new \Twig_Loader_Filesystem()));
$dumper = new CliDumper();
diff --git a/src/Symfony/Component/VarDumper/Tests/HtmlDumperTest.php b/src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php
similarity index 95%
rename from src/Symfony/Component/VarDumper/Tests/HtmlDumperTest.php
rename to src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php
index 24b4bf6d283a7..37a310e7ce65c 100644
--- a/src/Symfony/Component/VarDumper/Tests/HtmlDumperTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\VarDumper\Tests;
+namespace Symfony\Component\VarDumper\Tests\Dumper;
use PHPUnit\Framework\TestCase;
use Symfony\Component\VarDumper\Cloner\VarCloner;
@@ -22,7 +22,7 @@ class HtmlDumperTest extends TestCase
{
public function testGet()
{
- require __DIR__.'/Fixtures/dumb-var.php';
+ require __DIR__.'/../Fixtures/dumb-var.php';
$dumper = new HtmlDumper('php://output');
$dumper->setDumpHeader('