ozean12 / googlepubsub
与Google Cloud PubSub集成的Symfony 2/3集成
Requires
- php: ^7.0|^5.0
- google/cloud: ^0.35
- jms/serializer-bundle: ^2.4
Requires (Dev)
- phpunit/phpunit: ~4.8|~5.0
This package is not auto-updated.
Last update: 2024-09-28 20:14:42 UTC
README
Ozean12GooglePubSubBundle
一个将Google Cloud Pub Sub与您的应用程序集成的Symfony 2 / Symfony 3包。
安装
1. 需求包
composer require ozean12/googlepubsub
2. 设置
// app/AppKernel.php public function registerBundles() { $bundles = [ // ... new JMS\SerializerBundle\JMSSerializerBundle(), // if not already enabled new Ozean12\WebTranslateItBundle\Ozean12WebTranslateItBundle(), ]; // ... }
# app/config/config.yml ozean12_google_pub_sub: # your Google Cloud Project ID project_id: "%google_pub_sub_project_id%" # path to your Google Cloud Application Credentials file key_file_path: "%google_pub_sub_key_file_path%" # add this if you want to use logger (see Using Logger section for more info) logger_channel: pub_sub # list of PubSub topics (See Publishing section for more info) topics: - my_topic # list of Push subscriptions in format (subscription_name: service_name) (see Subscribing to Push messages section for more info) push_subscriptions: my_push_subscription: my_bundle.my_firts_push.subscriber
使用方法
1. 发布消息
为了将消息发布到PubSub,您需要首先定义主题,如前节所述。一旦主题定义,它就可以在Publisher服务中访问。
$message = new MyTopicMessage(); $publisher = $this->container->get('ozean12_google_pubsub.publisher.my_topic'); $result = $publisher->publish($message);
MyTopicMessage 是一个简单的类,它实现了 Ozean12\GooglePubSubBundle\DTO\MessageDataDTOInterface 接口,并持有需要包含在消息中的数据。
publish 方法还接受 attributes 数组作为第二个参数。
如果主题不存在,它将被自动创建。
调用结果将是一个 Ozean12\GooglePubSubBundle\DTO\PublishMessageResultDTO 的实例,它将包含创建的消息的ID。
2. 订阅推送消息
当使用推送订阅时,您需要创建一个端点,该端点将接收来自Google Pub/Sub的消息,然后将其传递给 PushSubscriberManager。此主题超出了包的范围。使用 FOS REST Bundle 的此设置示例
// GoogleCloudController.php use Ozean12\GooglePubSubBundle\DTO\PushMessageRequestDTO; /** * Class GoogleCloudController * * @Version("v1") * @Route("/google-cloud/") */ class GoogleCloudController extends FOSRestController { /** * @ApiDoc( * resource = true, * description = "Receive a new PubSub message and process it", * statusCodes = { * 204 = "Returned when successful", * 403 = "Returned when access denied" * } * ) * * @ParamConverter("message", converter="fos_rest.request_body") * * @Route("pub-sub") * @Method({"POST"}) * @View() * * @param PushMessageRequestDTO $message * @return mixed */ public function pubSub(PushMessageRequestDTO $message) { $this->get('ozean12_google_pubsub.push_subscriber_manager.service')->processMessage($message); } }
通过使用 @ParamConverter 注解,Symfony 将自动将请求转换为 PushMessageRequestDTO
PushMessageRequestDTO 有两个属性
message:PushMessageDTO的实例。有关所有字段的详细信息,请参阅 推送请求数据subscription: Pub/Sub 订阅名称的字符串
PushSubscriberManager->processMessage() 方法将遍历所有已注册的订阅者,并运行名称与消息的订阅属性相等的订阅者。订阅者的示例
// MyPushSubscriber.php use Ozean12\GooglePubSubBundle\DTO\PushMessageDTO; use Ozean12\GooglePubSubBundle\Service\Subscriber\PushSubscriberInterface; /** * Class MyPushSubscriber */ class MyPushSubscriber implements PushSubscriberInterface { /** * {@inheritdoc} */ public function process(PushMessageDTO $message) { /** @var SendTransactionalEmailDataDTO $emailDTO */ $data = base64_decode($message->getData()) // process your data here } }
3. 使用日志记录器
如果您想记录与Google服务的交互,请使用您想要使用的通道设置 logger_channel 选项。例如
monolog: handlers: # ... pub_sub: type: stream path: "%kernel.logs_dir%/pub_sub_%kernel.environment%.log" level: info channels: [pub_sub] channels: # ... - pub_sub ozean12_google_pub_sub: # ... logger_channel: pub_sub
这将产生以下日志条目
[2016-12-23 17:51:42] pub_sub.INFO: New topic my_topic created {"topic":"my_topic"} []
[2016-12-23 17:57:01] pub_sub.INFO: Message(s) 123456789 submitted to topic my_topic {"messages":"123456789","topic":"my_topic"} []
[2017-01-04 15:57:32] pub_sub.INFO: Received message : my_first_subscription[123456789]; Processed with MyBundle\Service\GooglePubSub\Subscriber\MyFirstSubscriber subscriber {"message":"123456789","subscription":"my_first_subscription","subscriberClass":"MyBundle\\Service\\GooglePubSub\\Subscriber\\MyFirstSubscriber"} []