2016-10-09 35 views
0

我試圖使用Pusher與Lumen將事件推送到客戶端以獲取數據刷新。 我創建非常簡單的事件:Lumen返回有關已刪除記錄的信息,總是得到ModelNotFoundException

class CarEvent extends Event implements ShouldBroadcast{ 

    use SerializesModels; 

    public $car; 
    private $type; 

    public function __construct(Car $car, $type) 
    { 
     $this->car = $car; 
     $this->type = $type; 
    } 

    public function broadcastOn() 
    { 
     return ['car']; 
    } 

    public function broadcastAs() 
    { 
     return $this->type; 
    } 
} 

而且我成功fireing它使用Event::fire(new CarEvent($car,"add"));
內推控制檯我的控制,我得到以下事件: enter image description here

我的問題,當我開始嘗試當記錄被刪除發送事件,下面是我的代碼:

public function deleteCar($id){ 

    $car = $this->cars->findOrFail($id); 
    $car->delete(); 

    $oldCar = new Car; 
    $oldCar->id=$id; 
    Event::fire(new CarEvent($oldCar,"delete")); 
    return Response::deleted(); 
} 

這總是給人ModelNotFoundException因爲米給定ID的odel不再存在,這是真的。

我的問題是我如何能夠觸發事件,這將告訴具有特定id的汽車被刪除。我不想創建另一個將擴展Event的類,並且將僅用於刪除,我想使用現有的CarEvent類。

我需要通過簡單對象只Id屬性,像這樣: enter image description here

我可以創建Car對象,並設置其屬性Id,不知怎麼禁用得到休息,如果從數據庫中的數據時,模型序列化?

回答

1

序列化時出現問題,而是反序列化時出現問題。 你看,你的事件使用SerializesModels特徵。這一特性有以下方法:

protected function getRestoredPropertyValue($value) 
{ 
    if (! $value instanceof ModelIdentifier) { 
     return $value; 
    } 

    return is_array($value->id) 
      ? $this->restoreCollection($value) 
      : (new $value->class)->newQuery()->useWritePdo()->findOrFail($value->id); 
} 

這種特質序列化模型爲ModelIdentifier,剛剛成立的類名和ID。在反序列化時,使用該信息從數據庫中新獲取模型。在你的刪除案例中,findOrFail使它失敗。

我想你現在可以想出一個適合你需求的解決方案。例如,我猜這個應該適用於不同的模型;如果你知道你只是想爲汽車模型,你可以做一個更直接的。

protected function getRestoredPropertyValue($value) 
{ 
    if ($this->type == 'delete' && $value instanceof ModelIdentifier) { 
     $model = (new $value->class); 
     $pk = $model->getQueueableId(); 
     $model->$pk = $value->id; 

     return $model; 
    } 


    return parent::getRestoredPropertyValue($value); 
} 

更新 也許這是清潔劑具有獨立的活動你的建議。所有的構造函數都應該得到一個Car模型,而對於刪除的情況,你可以用你需要的屬性創建一個簡單的對象。

abstract class CarEvent extends Event implements ShouldBroadcast 
{ 

    use SerializesModels; 

    public $car; 
    protected $type; 

    public function __construct(Car $car) 
    { 
     $this->car = $car; 
    } 

    public function broadcastOn() 
    { 
     return ['car']; 
    } 

    public function broadcastAs() 
    { 
     return $this->type; 
    } 
} 

class AddCarEvent extends CarEvent 
{ 

    protected $type = 'add'; 

} 

class DeleteCarEvent extends CarEvent 
{ 

    protected $type = 'delete'; 

    public function __construct(Car $car) 
    { 
     $this->car = (object) ['id' => $car->id]; 
    } 
} 
+0

感謝您的回答。對於臨時解決方法,我已經爲刪除創建了單獨的事件,但您的解決方案看起來更好。我可以建立我的其他活動將延伸的基本事件類嗎?我有C#背景,並開始在流明。我應該如何建立這個班級?我需要一種方法來指定類型和模型,比如C#中的泛型類。理想情況下,我可以將另一個模型傳遞給構造函數。你能否將這個課程添加到你的答案中? – Misiu

+0

@Misiu請參閱最新的答案。 – alepeino

+0

對不起,如此漫長的延遲。但我還有一個相關的問題。我可以克隆對象(汽車在我的情況),這樣我的事件將不僅返回身份證,但全模型。我知道我必須在刪除賽車之前宣佈賽事,之後我必須開始賽車,但這次賽車不會在我的數據庫中。我在嘗試刪除之前嘗試創建克隆,但沒有運氣。我可能必須添加'getRestoredPropertyValue'的修改版本。我應該如何改變它,以便它將返回已傳遞給事件的項目,並且不會嘗試從數據庫中獲取它?這可以通用於其他類型的事件嗎? – Misiu