2017-09-18 45 views
1

當在ERP中進行更改時,我收到來自API的通知。當我從API接收Laravel的通知數據時,最佳做法是什麼?

我接收到的URL地址(CallbackURL)的信息是JSON類型:

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

我有多個通知類型,改變的類型。之後,我做了一些驗證,連接模型並將數據保存在數據庫中。

我應該使控制器的所有邏輯?操縱這種數據的最佳做法是什麼?

+1

我想創建一個[事件](https://laravel.com/docs/5.5/events#defining-events),有控制器會提升/調度它並在[事件監聽器](https://laravel.com/docs/5.5/events#defining-listeners)中擁有邏輯。 – apokryfos

+0

這是一個非常好的解決方案。謝謝!但是當通知遇到路線時,是否有機會派發事件?我的意思是,是否有任何解決方案在路由器中調度事件? –

+0

'event()'助手通常是可用的,所以你可以做一些像'event(new ProductChangeEvent($ jsonArrayOfParameters))'或類似的東西。這可以在任何地方調用(例如,在路由動作回調中)。如果你的事件實現了'ShouldQueue'接口,那麼它也可以被添加到隊列中以延遲處理。 – apokryfos

回答

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)); 
}); 
相關問題