HasEvents.php 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php
  2. namespace Dcat\Admin\Grid\Concerns;
  3. use Dcat\Admin\Grid\Events;
  4. use Illuminate\Support\Facades\Event;
  5. trait HasEvents
  6. {
  7. /**
  8. * @var array
  9. */
  10. protected $dispatched = [];
  11. /**
  12. * 监听事件.
  13. *
  14. * @param string $class
  15. *
  16. * @param \Closure $callback
  17. */
  18. public function listen(string $class, \Closure $callback)
  19. {
  20. Event::listen($class, function (Events\Event $event) use ($callback) {
  21. if ($event->grid !== $this) {
  22. return;
  23. }
  24. return $callback($event->grid, ...$event->payload);
  25. });
  26. }
  27. /**
  28. * 触发事件.
  29. *
  30. * @param \Dcat\Admin\Grid\Events\Event $event
  31. */
  32. public function fire(Events\Event $event)
  33. {
  34. $this->dispatched[get_class($event)] = $event;
  35. Event::dispatch($event);
  36. }
  37. /**
  38. * 只触发一次.
  39. *
  40. * @param \Dcat\Admin\Grid\Events\Event $event
  41. */
  42. public function fireOnce(Events\Event $event)
  43. {
  44. if (isset($this->dispatched[get_class($event)])) {
  45. return;
  46. }
  47. return $this->fire($event);
  48. }
  49. }