haskel / grpc-web-bundle
gRPC-Web 协议的 Symfony 扩展包
v0.1.0
2023-08-11 22:25 UTC
Requires
- php: >=8.1
- ext-grpc: *
- google/protobuf: ^3.22
- grpc/grpc: ^1.41
- symfony/framework-bundle: ^6.0
README
安装
composer require haskel/grpc-web-bundle
将扩展包添加到 config/bundles.php
return [ // ... Haskel\GrpcWebBundle\GrpcWebBundle::class => ['all' => true], ];
配置
# config/packages/grpc_web.yaml grpc_web: # optional namespace of proto files proto_namespace: 'my.somenamespace.api' # optional name of response type attribute in request object response_type_attribute_name: '_grpc_response_type' # map of exception classes to grpc standard response codes exception_code_map: App\Exception\ValidationException: 1 App\Exception\InvalidArgumentException: 2 # configuration of integration with lexik_jwt_authentication bundle security: # optional class of success response builder success_response_builder: 'App\Security\SuccessResponseBuilder' # optional class of failure response builder failure_response_builder: 'App\Security\FailureResponseBuilder' # required class of sign in request sign_in_request_class: 'App\Model\Api\SignInRequest'
使用
创建 proto 文件
syntax = "proto3"; package grpc.api; service PingService { rpc Ping (PingRequest) returns (PingResponse) {} } message PingRequest { string message = 1; } message PingResponse { string message = 1; }
生成 PHP 代码
protoc --php_out=src --grpc-web_out=mode=grpcwebtext:src --proto_path=config/proto
创建控制器
<?php namespace App\Controller\Grpc; use App\Grpc\Api\PingRequest; use App\Grpc\Api\PingResponse; use Haskel\GrpcWebBundle\Attribute as Grpc; #[Grpc\Service('PingService', package: 'grpc.api')] class PingService { public function Ping(PingRequest $request): PingResponse { $message = $request->getMessage(); $response = new PingResponse(); $response->setMessage("pong:" . $message); return $response; } }