PHP和Symfony
本教程将向你展示如何使用Lokalise PHP SDK来创建webhook,在第三方应用程序中监听webhook事件,并处理传入的通知。
在本教程中,您将学习如何……
- 使用Lokalise API令牌
- 使用Lokalise API创建webhook
- 收听webhooks事件
- 处理传入的通知
你可以在GitHub上找到源代码.
先决条件
本指南假设您有一个Lokalise项目(如果没有,学习如何创建你的Lokalise项目在这里).在本教程中,我们将上传英文翻译。因此,请确保您的项目在ISO代码中添加了英文。
如果你想在你的电脑上本地执行本指南,你需要安装以下软件:
- PHP 8.0.2或以上版本
- Symfony CLI工具
- 代码编辑器
我们要建造什么
我们将创建一个简单的应用程序,允许用户在他们的Lokalise项目中注册webhook。该应用程序还将侦听由这些webhook生成的传入通知,并通过发送API请求对它们做出反应。
准备一个新的Symfony应用程序
运行以下命令创建一个新的Symfony应用程序:
Symfony新lokalise-webhooks—webapp
将创建框架应用程序lokalise-webhooks
为你的文件夹。
现在进入该文件夹,设置Symfony应用程序使用Lokalise PHP SDK:
CD lokalise-webhooks编码器需要lokalise/php-lokalise-api
获取API令牌
您应该获得一个现有的API令牌或生成一个新的令牌。学习如何获得Lokalise API令牌.将其存储在.env
请按以下方式存档:
LOKALISE_TOKEN = 123 def456
开放配置/ services.yaml
并添加token作为参数:
参数:lokalise。api_token: ' % env (LOKALISE_TOKEN) % '
运行你的应用
为了学习本教程,你需要将你的应用程序部署到一些主机上。此外,你可以使用ngrok:
- 运行如下命令:
symfony服务器:启动
- 遵循Ngrok入门指南
- 在终端中,导航到解压缩ngrok的文件夹
- 运行
./ngrok config add-authtoken
.使用实例 - 最后,运行
/ ngrok http 800
ngrok (Ctrl+C to quit)会话状态在线帐号用户名(计划:Free)版本3.0.3区域欧洲(eu)延迟计算…Web界面http://127.0.0.1:4040转发https://50e1-90-133-221-110.eu.ngrok.io -> http://localhost:8000连接ttl opn rt1 rt5 p50 p90 00 0.00 0.00 0.00 0.00
你的应用程序必须是公开可访问的
如果你的Symfony应用不能公开访问,就不可能注册Lokalise的webhook。这是因为Lokalise向提供的URL发送一个特殊的“ping”请求,并期望收到2xx状态码。如果URL不可访问,webhook将不会被创建。
添加模板
对象中添加一个新模板模板/ web_hooks / index.html.twig
文件:
{% for message in app.flash ('notice') %} {{message}} {% endfor %}
< form method="post" action="{{path('app_hooks_register')}}">
< input type="submit" value="Register webhook" /> form> . font =" font - size
我们将使用这个表单输入一个项目ID并注册一个新的webhook。
注册一个新的webhook
调整src /控制器/ WebHooksController.php
文件为所选项目创建一个新的webhook:
<?php名称空间的应用程序\控制器;控制器使用Symfony \包\ FrameworkBundle \ \ AbstractController;使用Symfony \ HttpFoundation \ \组件请求;组件使用Symfony \ \ HttpFoundation \反应;组件使用Symfony \ \ HttpFoundation \会议\ SessionInterface;使用Symfony \组件\路由\注释\路线;类WebHooksController扩展AbstractController{#[路由('/',名称:'app_hooks_home')]公共函数索引(SessionInterface $session): Response {return $this->render('web_hooks/index.html.twig');} #[Route('/registerHook', name: 'app_hooks_register', methods: ['POST'])]公共函数registerWebhook(SessionInterface $session, Request $ Request): Response {$projectId = $ Request -> Request ->get('projectId', null);if(空($projectId)) {$this->addFlash('通知','请输入项目id'); return $this->redirect($this->generateUrl('app_hooks_home')); } $client = new \Lokalise\LokaliseApiClient($this->getParameter('lokalise.api_token')); $client->webhooks->create( $projectId, [ 'url' => 'https://50e1-90-133-221-110.eu.ngrok.io/triggerHook', 'events' => [ 'project.key.added', ], ] ); $this->addFlash('notice', 'Hook registered'); return $this->redirect($this->generateUrl('app_hooks_home')); }
这个webhook将监听project.key.added
事件。通知将发送至/ triggerHook
路线。
回复通知
现在让我们调整src /控制器/ WebHooksController.php
再次归档以添加新的/ triggerHook
监听所有传入事件的路由:
<?php名称空间的应用程序\控制器;控制器使用Symfony \包\ FrameworkBundle \ \ AbstractController;使用Symfony \ HttpFoundation \ \组件请求;组件使用Symfony \ \ HttpFoundation \反应;组件使用Symfony \ \ HttpFoundation \会议\ SessionInterface;使用Symfony \组件\路由\注释\路线;类WebHooksController扩展AbstractController {#[Route('/triggerHook',名称:'app_hooks_trigger',方法:['POST'])]公共函数triggerHook(Request $ Request): Response {$data = json_decode($ Request ->getContent(), true, 5, JSON_THROW_ON_ERROR);$event = $data['event'] ??零; if ($event === 'project.key.added') { $keyId = $data['key']['id'] ?? null; $projectId = $data['project']['id'] ?? null; if ($projectId && $keyId) { $client = new \Lokalise\LokaliseApiClient($this->getParameter('lokalise.api_token')); $client->comments->create($projectId, $keyId, [ 'comments' => [ [ 'comment' => '@Bob please review this new key ', ], ] ]); $client->keys->update($projectId, $keyId, [ 'is_hidden' => true ]); } } return new Response('ok'); } }
Webhook数据以JSON格式发送。我们确保接收到的通知不是ping,并且具有正确的事件名称。然后,我们只需添加一个键注释并使用事件的数据更新键。
请注意,您的事件处理程序必须响应POST请求并返回2xx状态码。否则,Lokalise将认为webhook通知不成功,并尝试多次重新发送失败的通知。
测试出来
现在一切准备就绪!打开你的应用程序,并输入一个项目ID注册一个新的webhook。打开Lokalise,进入你的项目,点击顶部菜单中的“Apps”。找到“Webhooks”应用程序,点击它,然后按“管理”。你会看到一个新的webhook为你注册了:
![2022-05-09 16_52_05-My Web App _ Lokalise — Mozilla Firefox.png 1049](https://files.readme.io/9b07fb8-2022-05-09_16_52_05-My_Web_App___Lokalise__Mozilla_Firefox.png)
![Click to close... 1049](https://files.readme.io/9b07fb8-2022-05-09_16_52_05-My_Web_App___Lokalise__Mozilla_Firefox.png)
注意“X-Secret header”隐藏值。你可以在你的应用中使用这个值,并将它与发送给通知
路由进行额外的保护(从而过滤恶意请求)。
现在返回Lokalise项目编辑器,创建一个新的翻译键。重新加载页面,确保密钥被隐藏:
![2022-05-09 16_53_04-My Web App _ Lokalise — Mozilla Firefox.png 290](https://files.readme.io/556a11e-2022-05-09_16_53_04-My_Web_App___Lokalise__Mozilla_Firefox.png)
![Click to close... 290](https://files.readme.io/556a11e-2022-05-09_16_53_04-My_Web_App___Lokalise__Mozilla_Firefox.png)
点击“Comments”按钮(上面屏幕上的第一个按钮),确保注释显示正确:
![2022-05-09 16_53_28-My Web App _ Lokalise — Mozilla Firefox.png 528](https://files.readme.io/81acaae-2022-05-09_16_53_28-My_Web_App___Lokalise__Mozilla_Firefox.png)
![Click to close... 528](https://files.readme.io/81acaae-2022-05-09_16_53_28-My_Web_App___Lokalise__Mozilla_Firefox.png)
就是这样,干得好!
更新 3个月前