2017-07-17 19 views
8

Hiện tại tôi đang sử dụng các nhà quan sát để xử lý một số nội dung sau khi tạo và cập nhật các mô hình của mình.Phát sóng sự kiện hùng hồn bằng cách sử dụng các quan sát viên

Tôi muốn cập nhật ứng dụng của mình bằng cách đặt thời gian thực bằng cách sử dụng nhưng tôi không thể tìm thấy tài liệu liên quan đến việc sử dụng kết hợp với người quan sát (thay vì sự kiện).

Bạn có thể sử dụng các sự kiện và chức năng phát sóng kết hợp với người nghe tương ứng để nhận chức năng này nhưng tôi thích mã quan sát rõ ràng hơn (ít ma thuật hơn).

Nhìn vào mã của khuôn khổ laravel tôi có thể thấy rằng các quan sát vẫn sử dụng các sự kiện hùng hồn vì vậy tôi nghi ngờ rằng có một cách để phát sóng này. Vì vậy, câu hỏi của tôi: là có một cách để phát sóng các sự kiện hùng hồn bằng cách sử dụng mà không cần tạo sự kiện riêng lẻ hoặc thêm các phát biểu phát sóng theo cách thủ công trên mọi sự kiện? Có phải là một câu hỏi hay không?

+0

Tôi đang ở cùng vị trí bây giờ. Tôi đã cố gắng triển khai ShouldBroadcast trong quan sát nhưng không có may mắn. Bạn đã tìm thấy giải pháp nào với ít phép thuật hơn? – effe

+0

Tôi sẽ nói rằng bạn không thể. Nhưng bạn có thể viết một sự kiện năng động, điều đó sẽ đối phó với tất cả các nhà quan sát của bạn. Nếu bạn cho chúng tôi một ví dụ cụ thể hơn cho những gì bạn muốn đạt được, chúng tôi có thể tìm ra giải pháp. Ví dụ bạn có thể viết và sự kiện, điều đó sẽ nhận được tất cả thay đổi từ người quan sát được gọi và chuyển nó tới kênh phát sóng. – mimo

+1

Sau khi xem nhanh mã, có vẻ như các sự kiện mô hình, mô hình được coi là sự kiện được gửi đi, vì vậy hãy thử thêm giao diện 'ShouldBroadcast' vào mô hình của bạn và xác định phương thức' broadcastOn() 'để triển khai giao diện. Điều này là chưa được kiểm tra, vì vậy hãy cho chúng tôi biết nếu điều đó thực hiện những gì bạn đang tìm kiếm. – patricus

Trả lời

2

Câu hỏi thú vị! Chúng ta có thể tạo ra một người quan sát có thể sử dụng lại, có mục đích chung để phát sóng các sự kiện được bắn ra từ các mô hình mà nó quan sát. Điều này loại bỏ sự cần thiết phải tạo các sự kiện riêng lẻ cho mỗi kịch bản, và chúng ta có thể tiếp tục sử dụng các quan sát viên hiện có:

class BroadcastingModelObserver 
{ 
    public function created(Model $model) 
    { 
     event(new BroadcastingModelEvent($model, 'created')); 
    } 

    public function updated(Model $model) { ... } 
    public function saved(Model $model) { ... } 
    public function deleted(Model $model) { ... } 
} 

class BroadcastingModelEvent implements ShouldBroadcast 
{ 
    public $model; 
    public $eventType; 

    public function __construct(Model $model, $eventType) 
    { 
     $this->model = $model; 
     $this->eventType = $eventType; 
    } 

    public function broadcastOn() { ... } 
} 

Sau đó, chỉ cần hướng dẫn người quan sát để quan sát bất kỳ mô hình mà bạn cần để phát sóng các sự kiện để Echo cho:

User::observe(BroadcastingModelObserver::class); 
Post::observe(BroadcastingModelObserver::class); 
... 

Như bạn đã biết, nhiều người quan sát có thể quan sát cùng một mô hình. Đây là một ví dụ rất đơn giản. Chúng tôi có thể làm rất nhiều thứ gọn gàng với mẫu này. Ví dụ, chúng ta có thể khai báo thuộc tính nào chúng ta muốn phát trên mỗi mô hình và cấu hình sự kiện để lọc ra bất kỳ sự kiện nào mà mô hình không cho phép rõ ràng. Mỗi mô hình cũng có thể khai báo kênh mà sự kiện phát hành hoặc loại sự kiện mà nó sẽ phát sóng.

Ngoài ra, chúng tôi có thể phát sự kiện từ những người quan sát hiện có của bạn, nhưng có vẻ như bạn muốn tránh thêm các câu lệnh này vào mỗi người.

Các vấn đề liên quan