通过verschillende Notificeren kanalen

通过verschillende Notificeren kanalen

在德conferenties De gastenboekapplicatie verzamelt反馈。低平火山口我们zijn不行去河畔het判定van反馈onze gebruikers。

Aangezien reacties gemodereerd沃顿zullen gebruikers waarschijnlijk不行begrijpen waarom匈牙利语reacties不行直接gepubliceerd沃顿。泽zullen zelfs het formulier opnieuw invullen, omdat泽denken dat er甚至technisch probleem。反馈算法。na het toevoegen van甚至中邹活化geweldig zijn。

书moeten我们泽waarschijnlijk op de hoogte stellen wanneer匈牙利语中是gepubliceerd活化。Aangezien我们om匈牙利语e-mailadres vragen, kunnen dat低平火山口打赌gebruiken。

Er zijn vele manieren om gebruikers de hoogte te houden op。电子邮件是het eerste中河畔waar我misschien denkt低平火山口notificaties在de webapplicatie甚至安德利果汁mogelijkheid。Het是zelfs mogelijk om SMS-berichten te versturen,即使bericht op电报te而posten松弛。Er zijn是mogelijkheden。

Het ob娱乐下载Symfony通知组件implementeert vele notificatiestrategien。

在浏览器de Webapplicatie-notificaties versturen

Als甚至eerste堵塞,zullen gebruikers na匈牙利语inzending直接在浏览器de informeren / dat reacties gemodereerd沃顿。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -15 6 + 15 8 @@使用Syob娱乐下载mfony \ HttpFoundation \ \组件文件\ \ FileException异常;使用Syob娱乐下载mfony \ HttpFoundation \ \组件请求;组件使用ob娱乐下载Symfony \ \ HttpFoundation \反应;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \组件\ \通知\通知通知;+使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \组件\路由\注释\路线;类ConferenceController延伸AbstractController @@ -46年6 + 48岁,7美元@@类ConferenceController扩展AbstractController请求请求,会议会议上,美元CommentRepository CommentRepository美元,+ NotifierInterface通知美元,#【自动装配(% photo_dir %)]字符串photoDir美元,反应):{$评论=新的评论();@@ -74、9 + 77,15 @@类ConferenceController延伸AbstractController];$ this - >总线- >调度(新CommentMessage (- > getId()发表评论,美元上下文));+ $通知- >发送(新通知('谢谢你的反馈;你的评论将被审核后发布。”,(“浏览器”)));+返回$ this - > redirectToRoute(“会议”,(“鼻涕虫”= > $会议- > getSlug ()));}+如果($形式- > isSubmitted ()) {+ $通知- >发送(新通知(“你能检查你的提交吗?有一些问题。”,(“浏览器”)));+}+抵消美元= max(0, $请求- >查询- > getInt(“抵消”,0));$ paginator = $ commentRepository - > getCommentPaginator(会议,抵消美元);

德通知stuurt即使notificatienaar德ontvangers通过甚至kanaal

即使notificatie heeft甚至onderwerp,即使optionele inhoud en即使党。

即使notificatie菅直人verzonden沃顿通过即使米尔kanalen, afhankelijk van zijn党。我kunt urgente notificaties versturen middels SMS en reguliere bijvoorbeeld通过电子邮件。

我们geen ontvangers Voor browsermeldingen hebben。

De browsernotificatie maakt gebruik范flash的消息通过德通知sectie。我们moeten泽变迟虽然门德conferentie-template bij te威尔:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
- - - /模板/会议/ show.html.twig+ + + b /模板/会议/ show.html.twig13 @@ @@ 3 6 + 3{%块标题%}会议留言板,{{会议}}{% endblock %}{%块体%}在app.flashes +{%为消息(“通知”)%}+ < div class = "警报alert-info alert-dismissible褪色秀”>+{{消息}}+ <按钮类型=“按钮”class =“btn-close data-bs-dismiss =“警报”aria-label = "关闭" > < span aria-hidden = " true " >报;< / span > < /按钮>+ < / div >+ {% endfor %}+< h2类= " mb-5 " > < / h2 >{{会议}}会议

De gebruikers沃顿νop De hoogte gebracht dat匈牙利语inzending wordt gemodereerd:

/会议/阿姆斯特丹- 2019

Als甚至额外的奖金hebben我们,Als er甚至输出端在het formulier青春痘,甚至mooie河畔notificatie de bovenkant van de网站:

/会议/阿姆斯特丹- 2019

提示

Flash-berichten gebruiken hetHTTP-sessiesysteemals opslagmedium。Het gevolg hiervan是dat de http缓存wordt uitgeschakeld, omdat Het sessiesysteem gestart酩悦沃顿om te controleren op berichten。

说的是德reden waarom我们德flash-messages-snippet hebben河畔toegevoegd deshow.html.twig模板在河畔,不行de基地,omdat我们丹http缓存voor de主页kwijt zouden raken。

管理员notificeren通过电子邮件

在plaats van甚至电子邮件通过de te sturenMailerInterface,om de admin op de hoogte te stellen van het费特dat er zojuist甚至中geplaatst,活化库恩我overschakelen naar het Notifier-component de消息处理程序:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
推荐- - - - - - MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ 4,15 + 4,15 @@名称空间应用\ MessageHandler;使用App \ ImageOptimizer;使用App \ \ CommentMessage消息;+使用App \ \ CommentReviewNotification通知;使用App \ Repository \ CommentRepository;使用App \ SpamChecker;使用原则\ ORM \ EntityManagerInterface;使用日志Psr \ \ LoggerInterface;桥用Symob娱乐下载fony \ \树枝\ Mime \ NotificationEmail;使用Syob娱乐下载mfony \ DependencyInjection \属性\ \组件自动装配;用Symfob娱乐下载ony \ \梅勒\ MailerInterface组件;使用Syob娱乐下载mfony \信使\ \组件属性\ AsMessageHandler;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \工作流组件\ \ WorkflowInterface;# [AsMessageHandler] @@ -24, 8 + 24日7 @@类CommentMessageHandler私有CommentRepository CommentRepository美元,美元私人MessageBusInterface巴士,私人WorkflowInterface commentStateMachine美元,——美元私人MailerInterface梅勒,- #【自动装配(% admin_email %)]私人字符串adminEmail美元,+私人NotifierInterface通知美元,私人ImageOptimizer ImageOptimizer美元,#【自动装配(% photo_dir %)]私人字符串photoDir美元,私人? LoggerInterface $记录器= null, @@ -50年13 + 49岁7 @@类CommentMessageHandler $ this - > entityManager - >冲洗();$ this - >总线- >调度($消息);}elseif ($ this - > commentStateMachine - >(评论,美元“发布”)| | $ this - > commentStateMachine - >(评论美元,publish_ham)) {- $ this - >梅勒- >发送((新NotificationEmail ())- - - - - - - >主题(“新评论”)- - > htmlTemplate(邮件/ comment_notification.html.twig)- - > ($ this - > adminEmail)- - > ($ this - > adminEmail)- - - - - - - >上下文([“评论”= >评论美元])-);+ $ this - >通知- >发送(新CommentReviewNotification(评论美元),…$ this - >通知- > getAdminRecipients ());}elseif ($ this - > commentStateMachine - >(评论美元,“优化”)){如果($评论- > getPhotoFilename ()) {$ this - > imageOptimizer - >调整($ this - > photoDir‘/’。$评论- > getPhotoFilename ());

getAdminRecipients ()方法retourneert de admin-ontvangers zoals geconfigureerd de通知;颂歌说νbij om jouw特征e-mailadres脚趾te voegen:

1 2 3 4 5 6 7 8
- - - / config /包/ notifier.yaml+ + + b / config /包/ notifier.yaml@@ -13 4 + 13 4 @@框架:媒介:['邮件']低:['邮件']admin_recipients:——{电子邮件:admin@example.com}+ -{电子邮件:“% env (string:默认值:default_admin_email: ADMIN_EMAIL) %”}

Maakν德CommentReviewNotification类:

src /通知/ CommentReviewNotification.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27
名称空间应用程序\通知;使用应用程序\实体\评论;使用ob娱乐下载\组件\通知人\消息\EmailMessage;使用ob娱乐下载\组件\通知人\通知\EmailNotificationInterface;使用ob娱乐下载\组件\通知人\通知\通知;使用ob娱乐下载\组件\通知人\收件人\EmailRecipientInterface;CommentReviewNotification扩展通知实现了EmailNotificationInterface{公共函数__construct(私人评论美元评论,){::__construct (“新评论”);}公共函数asEmailMessage(EmailRecipientInterface美元收件人、字符串美元运输= null):哦?EmailMessage{美元消息= EmailMessage::fromNotification (美元,美元收件人,美元运输);美元消息- >getMessage ()- >htmlTemplate (“电子邮件/ comment_notification.html.twig”)- >上下文([“评论”= >美元- >评论]);返回美元消息;}}

asEmailMessage ()van de方法EmailNotificationInterfaceoptioneel,低平火山口我kunt邮件ermee aanpassen。

即使voordeel van het gebruik van de通知plaats货车直接德梅勒是dat het de融合loskoppelt van het“kanaal”dat daarvoor wordt gebruikt。Zoals我kunt虽然早,zegt不行expliciet dat de notificatie每电子邮件酩悦沃顿verzonden。

在plaats daarvan wordt het kanaal geconfigureerd配置/包/ notifier.yamlafhankelijk van hetvan de融合(standaard):

配置/包/ notifier.yaml
1 2 3 4 5 6 7 8
框架:通知:channel_policy:#使用聊天/松弛、聊天/电报,sms /为什么twilio或短信/ nexmo紧急:['邮件']高:['邮件']介质:['邮件']低:['邮件']

我们hebben gesproken de浏览器在德电子邮件kanalen。变迟我们皇后区kijken naar chiquere varianten。

Chatten遇到管理员

我们变迟我们eerlijk zijn wachten allemaal op positieve反馈。的ied geval constructieve反馈。Als iemand甚至中plaatst活化了woorden Als“伟大”(超级去)的“awesome”(geweldig),丹willen我们死misschien snel accepteren丹德anderen。

通过即使Voor dergelijke berichten willen我们甚至waarschuwing krijgen instant-messaging-systeem zoals松弛的电报,naast de reguliere电子邮件。

段松弛ondersteuning voor de Symfony通知:ob娱乐下载

1
美元ob娱乐下载symfony作曲家点播slack-notifier

Om te beginnen, bouw我德松DSN op见面甚至松弛访问令牌德松通道标识符waar我berichten naartoe必sturen。松:/ / ACCESS_TOKEN@default ?通道=通道

Omdat de访问令牌gevoelig,库恩我德松DSN秘密商店bewaren:

1
美元ob娱乐下载symfony控制台的秘密:SLACK_DSN

能源部hetzelfde voor效果:

1
美元ob娱乐下载symfony控制台的秘密:SLACK_DSN - env =刺激

活跃de喋喋不休松弛的支持:

1 2 3 4 5 6 7 8 9 10 11 12
- - - / config /包/ notifier.yaml+ + + b / config /包/ notifier.yaml7 + 1,7 @@ @@ 1日框架:通知:- # chatter_transports:- #松弛:' % env (SLACK_DSN) % '+ chatter_transports:+松:“% env (SLACK_DSN) %”#电报:“% env (TELEGRAM_DSN) %”# texter_transports: #为什么twilio: ' % env (TWILIO_DSN) % '

颂歌de通知类bij om berichten te routeren afhankelijk van de tekst在de reactie(见过甚至eenvoudige reguliere expressie):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25日26日
- - - / src /通知/ CommentReviewNotification.php+ + + b / src / / CommentReviewNotification.php通知@@ 7,6 + 7,7 @@使用Symob娱乐下载fony \组件\ \ EmailMessage通知\消息;组件使用ob娱乐下载Symfony \ \通知\ \ EmailNotificationInterface通知;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \组件\通知\接受者\ EmailRecipientInterface;+使用Syob娱乐下载mfony \组件\通知\接受者\ RecipientInterface;类CommentReviewNotification扩展通知实现EmailNotificationInterface{@@ -26年4 + 27日15 @@类CommentReviewNotification扩展通知实现EmailNotificatio返回美元消息;}++公共职能getChannels (RecipientInterface接收美元):数组+ {+如果(preg_match (' {\ b(好棒|)\ b}我,$ this - >评论- > getText ())) {+返回(“电子邮件”,“聊天/松弛”);+}++ $ this - >重要性(通知::IMPORTANCE_LOW);++返回(“电子邮件”);+}}

我们hebben显得het党凡“gewone reacties veranderd, omdat说het ontwerp van de邮件enigszins aangepast。

En klaar !Plaats甚至中遇到“awesome”活化(geweldig) de tekst我邹ν甚至bericht op松弛moeten ontvangen。

净zoals voor邮件库恩我德ChatNotificationInterfaceimplementeren om van de standaard呈现het松弛bericht te overschrijven:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
- - - / src /通知/ CommentReviewNotification.php+ + + b / src / / CommentReviewNotification.php通知18 @@ @@ 3 13 + 3名称空间的应用程序\通知;使用App \实体\评论;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ \ SlackDividerBlock块;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ \ SlackSectionBlock块;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ SlackOptions;+使用Syob娱乐下载mfony \组件\ \ ChatMessage通知\消息;使用Syob娱乐下载mfony \组件\ \ EmailMessage通知\消息;+使用Syob娱乐下载mfony \组件\通知\ \ ChatNotificationInterface通知;组件使用ob娱乐下载Symfony \ \通知\ \ EmailNotificationInterface通知;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \组件\通知\接受者\ EmailRecipientInterface;使用Syob娱乐下载mfony \组件\通知\接受者\ RecipientInterface;海尔集团实现EmailNotificationInterface CommentReviewNotification扩展了通知+类CommentReviewNotification扩展通知实现EmailNotificationInterface, ChatNotificationInterface{公共职能__construct(私人评论评论,美元@@ -28年6 + 33岁28 @@类CommentReviewNotification扩展通知实现EmailNotificatio返回美元消息;}+公共职能asChatMessage (RecipientInterface接收美元,字符串$运输= null): ? ChatMessage+ {+如果(“松弛”! = =运输美元){+返回null;+}++ $消息= ChatMessage: fromNotification(这一点,接受美元,美元运输);+ $消息- >主题($ this - > getSubject ());新SlackOptions + $消息- >选项((())+ - > iconEmoji(“大作”)+ - > iconUrl (“https://guestbook.example.com”)+ - >用户名(“留言板”)+ - >块((新SlackSectionBlock()) - >文本($ this - > getSubject ()))+ - >块(新SlackDividerBlock ())新SlackSectionBlock + - >块((())+ - >文本(sprintf (' % s (% s)说:% s的,$ this - >评论- > getAuthor (), $ this - >评论- > getEmail (), $ this - >评论- > getText ()))+)+);++返回美元消息;+}+公共函数getChannels (RecipientInterface接收美元):数组{如果(preg_match (“{\ b(好棒|)\ b}我,$ this - >评论- > getText ())) {

Het打赌佐薇,低平火山口变迟我们钉甚至堵塞佛得角服务员。邹het不行geweldig zijn om甚至中rechtstreeks通过松弛活化te kunnen accepteren afwijzen吗?

Wijzig de notificatie om de review-URL te accepteren en voeg矫饰的河畔knoppen脚趾het Slack-bericht:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29
- - - / src /通知/ CommentReviewNotification.php+ + + b / src / / CommentReviewNotification.php通知@@ 3、6 + 3、7 @@名称空间的应用程序\通知;使用App \实体\评论;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ \ SlackActionsBlock块;桥组件使ob娱乐下载用Symfony \ \通知\ \松弛\ \ SlackDividerBlock块;桥组件使ob娱乐下载用Symfony \ \通知\ \松弛\ \ SlackSectionBlock块;使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ SlackOptions;@@ -18、6 + 19日7 @@类CommentReviewNotification扩展通知实现EmailNotificatio{公共职能__construct(私人评论评论,美元+私人字符串reviewUrl美元,){父:__construct(“新评论”);6 + 52}@@ -50年,10 @@类CommentReviewNotification扩展通知实现EmailNotificatio - >块((新SlackSectionBlock()) - >文本(sprintf (“% s (% s)说:% s的,$ this - >评论- > getAuthor (), $ this - >评论- > getEmail (), $ this - >评论- > getText ())))新SlackActionsBlock + - >块((())+ - >按钮(“接受”,$ this - > reviewUrl,“主要”)+ - >按钮(“拒绝”,$ this - > reviewUrl。”?拒绝= 1”、“危险”)+));返回美元消息;

Hetν甚至kwestie van wijzigingen在omgekeerde volgorde te doorlopen。颂歌eerst de消息处理程序bij om de review-URL门te的算法:

1 2 3 4 5 6 7 8 9 10 11 12
推荐- - - - - - MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -49 7 + 49 8 @@类CommentMessageHandler $ this - > entityManager - >冲洗();$ this - >总线- >调度($消息);}elseif ($ this - > commentStateMachine - >(评论,美元“发布”)| | $ this - > commentStateMachine - >(评论美元,publish_ham)) {- $ this - >通知- >发送(新CommentReviewNotification(评论美元),…$ this - >通知- > getAdminRecipients ());+ $ = new CommentReviewNotification通知(评论,美元消息- > getReviewUrl ());+ $ this - >通知- >发送(通知、美元…$ this - >通知- > getAdminRecipients ());}elseif ($ this - > commentStateMachine - >(评论美元,“优化”)){如果($评论- > getPhotoFilename ()) {$ this - > imageOptimizer - >调整($ this - > photoDir‘/’。$评论- > getPhotoFilename ());

Zoals我kunt虽然酩悦德review-URL onderdeel zijn van het bericht变迟我们dat怒toevoegen:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
- - - / src /信息/ CommentMessage.php+ + + b / src /信息/ CommentMessage.php@@ 6、10 + 6、16 @@类CommentMessage{公共函数__construct(私人int id,美元+私人字符串reviewUrl美元,私人数组$上下文= []){}+公共职能getReviewUrl():字符串+ {+ $ this - > reviewUrl返回;+}+公共函数getId (): int{返回$ this - > id;

颂歌合计槽de控制器bij om de review-URL te genereren en geef deze门德评论信息构造函数:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39
- - - / src /控制器/ AdminController.php+ + + b / src /控制器/ AdminController.php@@ -12 6 + 12 7 @@使用Syob娱乐下载mfony \组件\ HttpKernel \ HttpCache \ StoreInterface;使用Syob娱乐下载mfony \ \ HttpKernel \ KernelInterface组件;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;使用Syob娱乐下载mfony \组件\路由\注释\路线;+使用Syob娱乐下载mfony \组件\ \发电机\ UrlGeneratorInterface路由;使用Syob娱乐下载mfony \工作流组件\ \ WorkflowInterface;用树枝\环境;@@ -42 43 7 + 8 @@类AdminController延伸AbstractController $ this - > entityManager - >冲洗();如果(接受美元){总线- $ this - > - >调度(新CommentMessage($评论- > getId ()));+ $ reviewUrl = $ this - > generateUrl (“review_comment”, (“id”= > $评论- > getId ()], UrlGeneratorInterface:: ABSOLUTE_URL);+ $ this - >总线- >调度(新CommentMessage(评论- > getId (), reviewUrl美元));}返回新的反应($ this - >树枝>渲染(“admin / review.html。嫩枝”,(- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -18 6 + 18 7 @@使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \组件\路由\注释\路线;+使用Syob娱乐下载mfony \组件\ \发电机\ UrlGeneratorInterface路由;类ConferenceController延伸AbstractController{@@ -75、7 + 76、8 @@类ConferenceController延伸AbstractController“推荐人”= >请求- >标题- >获取美元(“推荐人”)、“永久链接”= > $请求- > getUri ()];总线- $ this - > - >调度(新CommentMessage (- > getId()发表评论,美元上下文));+ $ reviewUrl = $ this - > generateUrl (“review_comment”, (“id”= > $评论- > getId ()], UrlGeneratorInterface:: ABSOLUTE_URL);+ $ this - >总线- >调度(新CommentMessage(评论- > getId (), reviewUrl美元,美元上下文));$通知- >发送(新通知('谢谢你的反馈;你的评论将被审核后发布。”,(“浏览器”)));

代码ontkoppelen betekent dat我veranderingen op meerdere plaatsen酩悦aanbrengen,低平火山口het maakt het gemakkelijker om te testen, te beredeneren en te hergebruiken。

探针het钉皇后区,het bericht邹ν去moeten zijn:

在德台湾加高lijn asynchroon服务员

Notificaties危险,净zoals邮件,standaard asynchroon verstuurd:

配置/包/ messenger.yaml
1 2 3 4 5 6 7 8 9
框架:信使:路由:ob娱乐下载Symfony \组件\梅勒\ \ SendEmailMessage使者:异步ob娱乐下载Symfony \组件\消息通知\ \ ChatMessage:异步ob娱乐下载Symfony \组件\消息通知\ \ SmsMessage:异步#你的消息路由到传输应用程序消息\ \ CommentMessage:异步

Als我们asynchrone berichten外的moeten schakelen,我们即使克莱因probleem hebben。Voor elke中ontvangen活化甚至松弛bericht我们甚至电子邮件。Als het松弛bericht不行afgeleverd菅直人沃顿(verkeerd通道id、verkeerd牌…),丹zal het messenger-bericht冲动出席opnieuw geprobeerd沃顿voordat deze verwijderd wordt。低平火山口omdat德电子邮件als eerste wordt verzonden, zullen ontvangen en geen松弛berichten我们3电子邮件。

Zodra一切asynchroon,沃顿berichten onafhankelijk。SMS-berichten zijn芦苇als asynchroon geconfigureerd voor het geval我显得op hoogte gebracht会沃顿op jouw telefoon。

每电子邮件Gebruikers op de hoogte brengen

De laatste taak是om gebruikers op De hoogte te stellen wanneer匈牙利语中是goedgekeurd活化。窟dacht我ervan om dat zelf te implementeren吗?

这项工作,包括代码示例,许可下Creative Commons BY-NC-SA 4.0许可证。