推动客户数据使用水银协议

编辑该页面

异步的工作已经完成或创建聊天应用程序是典型的用例要求“推”功能。

ob娱乐下载Symfony提供了一个简单的组件,之上的美居酒店协议,专门为这类设计的用例。

水银是一个开放的协议而设计的发布更新从服务器到客户端。这是一个现代和高效的基于定时器的轮询和WebSocket替代。

因为它是建立在上面服务器发送的事件(SSE)水银是开箱即用的支持在现代浏览器(旧版本的边缘,即需要一个polyfill),并高层实现在许多编程语言。

美居酒店提供了一个授权机制,自动重新连接的网络检索的丢失更新问题,存在的API,“无连接”推动智能手机和auto-discoverability(支持客户端可以自动发现和订阅更新的给定资源由于特定的HTTP头)。

所有这些特性在Symfony的集成支持。ob娱乐下载

在这个记录你可以看到一个Symfony的webob娱乐下载 API利用水银和API平台更新生活反应应用和移动应用(本地)反应生成使用API平台客户端发电机。

管理持久连接,水银依赖于一个中心:一个专用的服务器处理持久上交所与客户的联系。Symfob娱乐下载ony应用将更新发布中心,广播他们的客户。

多亏了Symfony的码头工人集成ob娱乐下载,Flex建议安装一个水银中心。运行docker-compose起来启动中心,如果你选择了这个选项。

如果你使用ob娱乐下载Symfony本地Web服务器,你必须开始的——no-tls选择。

1
美元ob娱乐下载symfony服务器:开始——no-tls - d

环境变量

当MercureBundle已经安装,.env您的项目已经更新的文件Flex配方包括可用env var。

同样,如果您正在使用Symfony的码头工人集成本地Web服务器,ob娱乐下载ob娱乐下载Symfony码头工人或者是API平台分布,适当的环境变量自动设置,直接跳到下一节。

否则,设置你的中心的URL的值MERCURE_URLMERCURE_PUBLIC_URLenv var。有时必须由Symfony应用调用不同的URL(通常出版),和JavaScript客户机(通常订阅ob娱乐下载)。这是特别常见的Symfony应用时必须使用本地URL和一个公共客ob娱乐下载户端JavaScript代码。在这种情况下,MERCURE_URL必须包含当地Symfony应用程序所使用的URL(例如ob娱乐下载https://mercure/.well-known/mercure),MERCURE_PUBLIC_URL公开的URL(例如https://example.com/.well-known/mercure)。

客户也必须承担JSON Web标记(JWT)美居中心授权更新和发布,有时,订阅。

这个令牌必须签署相同的密钥使用的一个中心来验证智威汤逊(ChangeThisMercureHubJWTSecretKey !如果你使用码头工人集成)。这必须存储在密钥MERCURE_JWT_SECRET环境变量。MercureBundle将用它来自动生成和所需的jwt迹象。

除了这些环境变量,MercureBundle提供了一种更高级的配置:

  • 秘密:用来标志JWT的关键——相同大小的一个关键作为散列输出(例如,256位“HS256”)必须使用或更大。(所有其他选项,旁边算法,订阅,发布将被忽略)
  • 发布:一个主题列表允许出版在生成智威汤逊(时才可用秘密,或工厂提供)
  • 订阅:允许订阅的主题列表生成智威汤逊(时才可用秘密,或工厂提供)
  • 算法:该算法使用签署智威汤逊(时才可用秘密提供)
  • 提供者:一个服务调用的ID提供智威汤逊(所有其他选项将被忽略)
  • 工厂:一个服务调用的ID来创建智威汤逊(所有其他选项,旁边订阅,发布将被忽略)
  • 价值:原始JWT使用(所有其他选项将被忽略)
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ mercure.yaml美居酒店:中心:默认值:url:https://mercure-hub.example.com/.well-known/mercurejwt:秘密:“ChangeThisMercureHubJWTSecretKey !”发布:(“foo”,“https://example.com/foo”]订阅:['酒吧',“https://example.com/bar”]算法:“hmac.sha256”供应商:“我的\提供者”工厂:“我的\工厂”值:“my.jwt”

提示

JWT负载至少必须包含下列结构为客户被允许发布:

1 2 3 4 5
{“水银”:{“发布”:[]}}

因为数组为空,Symfony应用只会授权发布公共更新(请参阅ob娱乐下载授权部分进行进一步的信息)。

jwt。io网站是一种方便的方法来创建和智威汤逊迹象。签出这JWT例子,资助出版的权利主题(注意数组中的明星)。不要忘记设置密钥正确的底部面板的形式!

更新值对象代表更新发布。它还提供了一个出版商服务调度中心的更新。

出版商服务可以注射使用自动装配在任何其他服务,包括控制器:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/ / src /控制器/ PublishController.php名称空间应用程序\控制器;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\美居酒店\HubInterface;使用ob娱乐下载\组件\美居酒店\更新;PublishController扩展AbstractController{公共函数发布(HubInterface美元中心):响应{美元更新=更新(“https://example.com/books/1”,json_encode (“状态”= >“OutOfStock”)));美元中心- >发布(美元更新);返回响应(“发表!”);}}

第一个参数传递更新构造函数是主题被更新。应该是这个主题IRI(国际化资源标识符,RFC 3987):一个惟一的标识符的资源被派出。

通常,这个参数包含资源的原始URL传递给客户端,但它可以是任何字符串或IRI,它不需要存在一个URL(类似于XML名称空间)。

第二个参数的构造函数的内容更新。它可以是任何东西,任何格式的存储。然而,超媒体格式序列化资源如JSON-LD、原子,建议HTML或XML。

美居酒店()树枝函数生成的URL水银中心根据配置。URL包含了主题查询参数对应的主题作为第一个参数传递。

如果你想从一个外部JavaScript文件,访问这个URL生成URL在一个专用的HTML元素:

1 2 3
<脚本类型=“application / json”id=“mercure-url”>{{美居酒店| (“https://example.com/books/1”)json_encode(常数(“JSON_UNESCAPED_SLASHES”)b或常数(“JSON_HEX_TAG”))|}}< /脚本>

然后从JS文件中检索它:

1 2 3
常量url =JSON.parse (文档.getElementById (“mercure-url”).textContent);常量eventSource =EventSource (url);/ /……

水银还允许订阅一些主题,并使用URI模板或一个特殊的值*(由所有主题匹配)模式:

1 2 3 4 5 6 7 8 9 10 11 12
<脚本>{#订阅更新几个图书资源和审查所有资源匹配给定的模式#}常量eventSource =EventSource ({{水银([' https://example.com/books/1 ', ' https://example.com/books/2 ', ' https://example.com/reviews/ {id} ']) |逃避(js)}}”);eventSource。onmessage =事件= >{控制台。log(JSON.parse(event.data)); }< /脚本>

提示

Google Chrome DevTools本地集成实用的用户界面显示在实时接收到的事件:

使用它:

  • 打开DevTools
  • 选择“网络”选项卡
  • 点击请求美居中心
  • 点击“EventStream”子。

提示

测试如果URI模板匹配使用的URL在线调试器

链接HTTP报头。

您可以创建链接头的发现助手类(在引擎盖下,它使用连接组件):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src /控制器/ DiscoverController.php名称空间应用程序\控制器;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\JsonResponse;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\美居酒店\发现;DiscoverController扩展AbstractController{公共函数发现(请求美元请求,发现美元发现):JsonResponse{/ /链接:< https://hub.example.com/.well-known/mercure >;rel = "美居酒店"美元发现- >通过addLink (美元请求);返回美元- >json ([“@ id”= >“/书籍/ 1”,“可用性”= >“https://schema.org/InStock”]);}}

然后,这个头可以解析客户端找到中心的URL,并订阅:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /获取原始资源由Symfony的web服务APIob娱乐下载fetch (“/书籍/ 1”)/ /链接:< https://hub.example.com/.well-known/mercure >;rel = "美居酒店"不要犹豫(响应= >{/ /提取中心的URL链接标题常量hubUrl = response.headers.get (“链接”).match (/ < ([^ >]+)>;\ s + rel =(?:美居酒店|“^”*水银[^]*)/)[1];/ /添加订阅的主题(s)作为查询参数常量中心=URL (hubUrl,窗口.origin);hub.searchParams.append (“主题”,“https://example.com/books/ {id}”);/ /订阅更新常量eventSource =EventSource(中心);eventSource。onmessage =事件= >控制台. log (event.data);});

更新构造函数真正的:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src /控制器/ Publish.php名称空间应用程序\控制器;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\美居酒店\更新;PublishController扩展AbstractController{公共函数发布(HubInterface美元中心):响应{美元更新=更新(“https://example.com/books/1”,json_encode (“状态”= >“OutOfStock”]),真正的/ /私有);/ /出版商的JWT必须包含这个话题,水银的URI模板匹配或*。发布或者你会得到一个401年/ /用户的JWT必须包含这个话题,水银的URI模板匹配或*。订阅接收更新美元中心- >发布(美元更新);返回响应(“私人更新发布!”);}}

订阅私人更新,用户必须提供到中心JWT包含主题选择器匹配的主题更新。

提供这个JWT,订阅者可以使用cookie,或一个授权HTTP报头。

饼干可以设置自动Symfony通过适当的选项ob娱乐下载美居酒店()树枝的功能。饼干,Symfony会自动通过ob娱乐下载浏览器如果美居中心withCredentials的属性EventSource类是设置为真正的。然后,中心验证的有效性提供了JWT,并提取主题选择器。

1 2 3 4 5
<脚本>常量eventSource =EventSource ({{水银(' https://example.com/books/1 ',{订阅:' https://example.com/books/1 '}) |逃避(js)}}”,{withCredentials:真});< /脚本>

支持的选项是:

  • 订阅:包括的主题选择器的列表mercure.subscribe智威汤逊的索赔
  • 发布:包括的主题选择器的列表mercure.publish智威汤逊的索赔
  • additionalClaims:包括额外索赔JWT(截止日期,令牌ID…)

使用cookie是最安全的,首选方法当客户机是一个web浏览器。如果客户不是一个web浏览器,然后使用一个授权头的路要走。

谨慎

使用cookie验证方法,Symfony应用和中心必须从同一个域(可以是不同子域)。ob娱乐下载

提示

本机实现EventSource不允许指定标题。例如,授权使用不记名令牌。为了达到这个目的,使用一个polyfill

1 2 3 4 5 6 7
<脚本>常量es =EventSourcePolyfill ({{美居酒店(https://example.com/books/1)}}”{标题:{“授权”:“持票人”+令牌,}});< /脚本>

然后,创建以下实体就足以让一个有很多特色的超媒体的API,通过美居中心和自动更新广播:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /实体/ Book.php名称空间应用程序\实体;使用ApiPlatform\核心\注释\ApiResource;使用学说\ORM\映射作为ORM;# (ApiResource(水银:真)]# (ORM \实体){# (ORM \ Id)# (ORM \列)公共字符串美元的名字=;# (ORM \列)公共字符串美元状态=;}

作为展示在这个记录,API平台客户端发电机还允许支架完成反应和反应本机应用程序从这个API。这些应用程序将在实时渲染美居酒店更新的内容。

结帐平台的专用API文档欧宝官网下载app了解更多关于它的美居酒店的支持。

对于功能测试,您可以创建一个存根的中心:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /测试/功能/存根/ HubStub.php名称空间应用程序\测试\功能\存根;使用ob娱乐下载\组件\美居酒店\HubInterface;使用ob娱乐下载\组件\美居酒店\更新;HubStub实现了HubInterface{公共函数发布(更新美元更新):字符串{返回“id”;}/ /实现HubInterface其它方法}

使用HubStub替换默认中心服务实际上没有更新发送:

1 2 3
#配置/ services_test.yamlmercure.hub.default:类:应用\ \ \存根\ HubStub功能测试

MercureBundle支持多个中心,你可以替换其他相应的服务定义。

使在你的配置面板,如下:

MercureBundle是附带一个调试面板。安装调试包启用:

1
美元作曲家要求- dev symfony / deob娱乐下载bug-pack

提示

异步调度是气馁。大多数美居酒店中心已经处理异步出版物和使用信使通常是没有必要的。

而不是打电话出版商直接服务,你也可以让Symfony调度提供的异步更新由于与信使组件集成ob娱乐下载。

首先,要确保安装信使组件和配置正确传输(如果你不,处理程序将被称为同步)。

然后,分派水银更新信使号的消息总线,它将被自动处理:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src /控制器/ PublishController.php名称空间应用程序\控制器;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\美居酒店\更新;使用ob娱乐下载\组件\信使\MessageBusInterface;PublishController扩展AbstractController{公共函数发布(MessageBusInterface美元公共汽车):响应{美元更新=更新(“https://example.com/books/1”,json_encode (“状态”= >“OutOfStock”)));/ /同步或异步(原则、RabbitMQ卡夫卡…)美元公共汽车- >调度(美元更新);返回响应(“发表!”);}}

通知组件。用它来推送通知发送到web浏览器。
  • ob娱乐下载Symfony UX涡轮图书馆使用水银一样提供经验与单页面应用程序而无需编写一行JavaScript !
  • 这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
    ob娱乐下载Symfony 6.2支持通过苏禄人
    ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop
    ob娱乐下载Symfony代码性能”>< /a>
          <p class=ob娱乐下载Symfony代码性能

    代码消耗服务器资源。黑焰告诉你”>< /a>
          <p class=代码消耗服务器资源。黑焰告诉你

    阅读我们完整的Symfony和PHP目录ob娱乐下载为您的web开发需要的解决方案。”>< /a>
          <p class=阅读我们完整的Symfony和PHP目录ob娱乐下载为您的web开发需要的解决方案。