mariopenterman/protobuf-plugin

PHP代码生成插件,用于Google的Protocol Buffers

0.1.4 2021-07-15 12:11 UTC

This package is auto-updated.

Last update: 2024-09-15 18:48:41 UTC


README

Build Status Coverage Status

PHP版本的Protobuf是Google的Protocol Buffers在PHP语言中的实现,支持其二进制数据序列化,并包含一个protoc插件,可以从.proto文件生成PHP类。

安装

如果您想将.proto定义编译成PHP,您需要从您喜欢的包管理器或从源代码安装Google的Protocol Buffers。此插件目前支持protobuf 2.3.0或更高版本。

注意Google的Protocol Buffers和proto不是protobuf-php/protobuf的运行时要求。如果您想使用protobuf-php/protobuf-plugin将定义编译到PHP中,则这是必要的。

安装Google的Protocol Buffers

  • OSX安装
$ brew install protobuf
  • Ubuntu
$ sudo apt-get install -y protobuf

确保用户路径中有protoc可用

$ protoc --version
$ # libprotoc 2.6.1

注意有关如何安装/编译Google的Protocol Buffers的更多信息,请参阅:https://github.com/google/protobuf

Composer安装

要安装PHP插件,请运行以下composer命令

$ composer require "protobuf-php/protobuf-plugin"

定义您的协议格式

要创建您的地址簿应用程序,您需要从一个.proto文件开始。在.proto文件中的定义很简单:您为每个要序列化的数据结构添加一个消息,然后指定消息中每个字段的名称和类型。以下是定义您的消息的.proto文件,即addressbook.proto

package tutorial;
import "php.proto";
option (php.package) = "Tutorial.AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

message AddressBook {
  repeated Person person = 1;
}

如您所见,语法类似于C++或Java。让我们逐部分分析文件并了解其功能。.proto文件以一个包声明开始,这有助于防止不同项目之间的命名冲突。在PHP中,包名用作PHP命名空间,除非您明确指定了(php.package),就像我们在这里做的那样。即使您提供了(php.package),您仍然应该定义一个正常的包,以避免在Protocol Buffers命名空间以及非PHP语言中发生名称冲突。

您可以在Protocol Buffer语言指南中找到编写.proto文件的完整指南 - 包括所有可能的字段类型。不过,请记住,协议缓冲区不支持类继承这样的功能。

编译您的Protocol Buffers

现在您有了.proto,下一步需要做的就是生成您将需要的类,以读取和写入AddressBook(以及因此PersonPhoneNumber)消息。为此,您需要在您的.proto上运行协议缓冲区插件。

在这种情况下

php ./vendor/bin/protobuf --include-descriptors -i . -o ./src/ ./addressbook.proto

这将在指定的目标目录中生成以下PHP类

src/
└── Tutorial
    └── AddressBookProtos
        ├── AddressBook.php
        ├── Person
        │   ├── PhoneNumber.php
        │   └── PhoneType.php
        └── Person.php

注意有关如何使用生成的代码的更多信息,请参阅:protobuf-php/protobuf