-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
[VarDumper] Add Redis caster #18675
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[VarDumper] Add Redis caster #18675
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
<?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\VarDumper\Caster; | ||
|
||
use Symfony\Component\VarDumper\Cloner\Stub; | ||
|
||
/** | ||
* Casts Redis class from ext-redis to array representation. | ||
* | ||
* @author Nicolas Grekas <p@tchwork.com> | ||
*/ | ||
class RedisCaster | ||
{ | ||
private static $serializer = array( | ||
\Redis::SERIALIZER_NONE => 'NONE', | ||
\Redis::SERIALIZER_PHP => 'PHP', | ||
2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY | ||
); | ||
|
||
public static function castRedis(\Redis $c, array $a, Stub $stub, $isNested) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does the VarDumper component internally need the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. all caster have the same signature, this prevents misleading uses and opens extensibility by reserving & enforcing that any subclass will deal with them (at least forwarding the values). |
||
{ | ||
$prefix = Caster::PREFIX_VIRTUAL; | ||
|
||
if (defined('HHVM_VERSION_ID')) { | ||
$ser = $a[Caster::PREFIX_PROTECTED.'serializer']; | ||
$a[Caster::PREFIX_PROTECTED.'serializer'] = isset(self::$serializer[$ser]) ? new ConstStub(self::$serializer[$ser], $ser) : $ser; | ||
|
||
return $a; | ||
} | ||
|
||
if (!$connected = $c->isConnected()) { | ||
return $a + array( | ||
$prefix.'isConnected' => $connected, | ||
); | ||
} | ||
|
||
$ser = $c->getOption(\Redis::OPT_SERIALIZER); | ||
$retry = defined('Redis::OPT_SCAN') ? $c->getOption(\Redis::OPT_SCAN) : 0; | ||
|
||
return $a + array( | ||
$prefix.'isConnected' => $connected, | ||
$prefix.'host' => $c->getHost(), | ||
$prefix.'port' => $c->getPort(), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can't we dump the host and port even when not connected ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Host and port are given as args of the connect method, which means you can't |
||
$prefix.'auth' => $c->getAuth(), | ||
$prefix.'dbNum' => $c->getDbNum(), | ||
$prefix.'timeout' => $c->getTimeout(), | ||
$prefix.'persistentId' => $c->getPersistentID(), | ||
$prefix.'options' => new EnumStub(array( | ||
'READ_TIMEOUT' => $c->getOption(\Redis::OPT_READ_TIMEOUT), | ||
'SERIALIZER' => isset(self::$serializer[$ser]) ? new ConstStub(self::$serializer[$ser], $ser) : $ser, | ||
'PREFIX' => $c->getOption(\Redis::OPT_PREFIX), | ||
'SCAN' => new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry), | ||
)), | ||
); | ||
} | ||
|
||
public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, $isNested) | ||
{ | ||
$prefix = Caster::PREFIX_VIRTUAL; | ||
|
||
return $a + array( | ||
$prefix.'hosts' => $c->_hosts(), | ||
$prefix.'function' => $c->_function(), | ||
); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
<?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\VarDumper\Tests\Caster; | ||
|
||
use Symfony\Component\VarDumper\Test\VarDumperTestTrait; | ||
|
||
/** | ||
* @author Nicolas Grekas <p@tchwork.com> | ||
* @requires extension redis | ||
*/ | ||
class RedisCasterTest extends \PHPUnit_Framework_TestCase | ||
{ | ||
use VarDumperTestTrait; | ||
|
||
public function testNotConnected() | ||
{ | ||
$redis = new \Redis(); | ||
|
||
if (defined('HHVM_VERSION_ID')) { | ||
$xCast = <<<'EODUMP' | ||
Redis { | ||
#host: "" | ||
%A | ||
} | ||
EODUMP; | ||
} else { | ||
$xCast = <<<'EODUMP' | ||
Redis { | ||
isConnected: false | ||
} | ||
EODUMP; | ||
} | ||
|
||
$this->assertDumpMatchesFormat($xCast, $redis); | ||
} | ||
|
||
public function testConnected() | ||
{ | ||
$redis = new \Redis(); | ||
if (!@$redis->connect('127.0.0.1')) { | ||
$e = error_get_last(); | ||
self::markTestSkipped($e['message']); | ||
} | ||
|
||
if (defined('HHVM_VERSION_ID')) { | ||
$xCast = <<<'EODUMP' | ||
Redis { | ||
#host: "127.0.0.1" | ||
%A | ||
} | ||
EODUMP; | ||
} else { | ||
$xCast = <<<'EODUMP' | ||
Redis { | ||
+"socket": Redis Socket Buffer resource | ||
isConnected: true | ||
host: "127.0.0.1" | ||
port: 6379 | ||
auth: null | ||
dbNum: 0 | ||
timeout: 0.0 | ||
persistentId: null | ||
options: { | ||
READ_TIMEOUT: 0.0 | ||
SERIALIZER: NONE | ||
PREFIX: null | ||
SCAN: NORETRY | ||
} | ||
} | ||
EODUMP; | ||
} | ||
|
||
$this->assertDumpMatchesFormat($xCast, $redis); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are you planning to add the docblocks when the PR will be ready to merge?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nope, I'm not planning any doc block here...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@nicolas-grekas, that makes me wonder: which are the criteria we use to decide what to document and what to not document?