【问题标题】:What is a best practice when I receive notification data from an API into Laravel?当我从 API 接收通知数据到 Laravel 时,最佳实践是什么?
【发布时间】:2018-02-27 05:19:29
【问题描述】:

当 ERP 发生更改时,我会收到来自 API 的通知。

我收到的URL地址(CallbackURL)的消息是JSON类型的:

{
    "NotificationType": "Product Change",
    "ChangeType": "Update",
    "Trigger": "M_Product",
    "Value": "00087GH" 
}

我有多种通知类型,也有更改类型。之后,我进行了一些验证,连接模型并将数据保存到数据库中。

我应该在控制器中创建所有逻辑吗?处理此类数据的最佳做法是什么?

【问题讨论】:

  • 我会创建一个event,让控制器提升/调度它,并在event listener 中包含逻辑。
  • 这是一个非常好的解决方案。谢谢!但是当通知到达路由时,是否有机会分派事件?我的意思是,有什么解决方案可以在路由器中调度事件吗?
  • event() 助手通常可用,因此您可以执行类似event(new ProductChangeEvent($jsonArrayOfParameters)) 或类似的操作。这可以在任何地方调用(例如在路由操作回调中)。如果您的事件实现了ShouldQueue 接口,作为额外的奖励,那么它也可以添加到队列中以进行延迟处理。
  • 太棒了。谢谢!如果需要,您可以将其添加为问题的答案。

标签: php laravel rest api


【解决方案1】:

您可以创建一个为您执行此操作的事件:

 class ProductChangeEvent {
      use SerializesModels;//Maybe needed
      public $parameters;
      public function __construct($parameters) {
           $this->parameters = $parameters;
      }
 }

这个类可以选择实现ShouldQueue 接口,允许它被延迟。

您可以通过侦听器处理该事件:

class ProductChangeListener {

     public function handle(ProductChangeEvent $event) {
            switch ($event->parameters["NotificationType"]) {
                  //more cases?
                  case "Product Change": 
                  default:
                        $this->handleProductChange($event);
            }
     }

     protected function handleProductChange(ProductChangeEvent $event) {
           if ($event->parameters["ChangeType"] == "Update") {
               //Handle update product change
           }
     }
}

显然这只是一个例子。您可以根据您的实际用例进行功能拆分和案例。

然后您可以在路由处理程序中引发此事件:

Route::get("/eventListenerCallback", function (Request $req) {
      $parameters = json_decode($request->getContent(), true); //Is this right?
      event(new ProductChangeEvent($parameters));
}); 

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 2016-03-23
    • 2016-09-19
    • 1970-01-01
    • 2011-03-17
    • 2016-04-06
    • 2019-08-11
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多