public encodeMessage ( |
||
$message | ||
$level | integer | |
return |
public function encodeMessage(Message $message, $level = 0)
{
$reflect = new ReflectionClass($message);
$properties = $reflect->getProperties(ReflectionProperty::IS_PROTECTED);
$indent = str_repeat(' ', $level);
$stream = Stream::create();
foreach ($properties as $property) {
$property->setAccessible(true);
$name = $property->getName();
$value = $property->getValue($message);
if ($value === null) {
continue;
}
if (!is_array($value) && !$value instanceof Traversable) {
if (!$value instanceof Message) {
$item = $this->encodeValue($value);
$buffer = $indent . $name . ': ' . $item . PHP_EOL;
$stream->write($buffer, strlen($buffer));
continue;
}
$innerStream = $this->encodeMessage($value, $level + 1);
$beginMessage = $indent . $name . ' {' . PHP_EOL;
$endMessage = $indent . '}' . PHP_EOL;
$stream->write($beginMessage, strlen($beginMessage));
$stream->writeStream($innerStream, $innerStream->getSize());
$stream->write($endMessage, strlen($endMessage));
continue;
}
foreach ($value as $val) {
// Skip nullified repeated values
if ($val == null) {
continue;
}
if (!$val instanceof Message) {
$item = $this->encodeValue($val);
$buffer = $indent . $name . ': ' . $item . PHP_EOL;
$stream->write($buffer, strlen($buffer));
continue;
}
$innerStream = $this->encodeMessage($val, $level + 1);
$beginMessage = $indent . $name . ' {' . PHP_EOL;
$endMessage = $indent . '}' . PHP_EOL;
$stream->write($beginMessage, strlen($beginMessage));
$stream->writeStream($innerStream, $innerStream->getSize());
$stream->write($endMessage, strlen($endMessage));
}
}
$stream->seek(0);
return $stream;
}
public function testFormatComplexMessage() { $book = new AddressBook(); $person = new Person(); $person->setId(2051); $person->setName('John Doe'); $person->setEmail('*****@*****.**'); $phone = new Person\PhoneNumber(); $phone->setNumber('1231231212'); $phone->setType(Person\PhoneType::HOME()); $person->addPhone($phone); $phone = new Person\PhoneNumber(); $phone->setNumber('55512321312'); $phone->setType(Person\PhoneType::MOBILE()); $person->addPhone($phone); $book->addPerson($person); $person = new Person(); $person->setId(23); $person->setName('Iván Montes'); $person->setEmail('*****@*****.**'); $phone = new Person\PhoneNumber(); $phone->setNumber('3493123123'); $phone->setType(Person\PhoneType::WORK()); $person->addPhone($phone); $book->addPerson($person); $expected = $this->getProtoContent('addressbook.txt'); $actual = $this->textFormat->encodeMessage($book); $this->assertEquals($expected, (string) $actual); }