Protobuf\TextFormat::encodeMessage PHP Method

encodeMessage() public method

public encodeMessage ( Message $message, integer $level ) : Stream
$message Message
$level integer
return Stream
    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;
    }

Usage Example

Exemplo n.º 1
0
 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);
 }
All Usage Examples Of Protobuf\TextFormat::encodeMessage