BuilderEvents.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace Dcat\Admin\Traits;
  3. trait BuilderEvents
  4. {
  5. /**
  6. * Register a resolving listener.
  7. *
  8. * @param callable $callback
  9. * @param bool $once
  10. */
  11. public static function resolving(callable $callback, bool $once = false)
  12. {
  13. static::setListeners('builder.resolving', $callback, $once);
  14. }
  15. /**
  16. * @param array ...$params
  17. */
  18. protected function callResolving(...$params)
  19. {
  20. $this->callBuilderListeners('builder.resolving', ...$params);
  21. }
  22. /**
  23. * Register a composing listener.
  24. *
  25. * @param callable $callback
  26. * @param bool $once
  27. */
  28. public static function composing(callable $callback, bool $once = false)
  29. {
  30. static::setListeners('builder.composing', $callback, $once);
  31. }
  32. /**
  33. * @param array ...$params
  34. */
  35. protected function callComposing(...$params)
  36. {
  37. $this->callBuilderListeners('builder.composing', ...$params);
  38. }
  39. /**
  40. * @param $listeners
  41. * @param array ...$params
  42. */
  43. protected function callBuilderListeners($key, ...$params)
  44. {
  45. $object = app('admin.object');
  46. $key = static::formatBuilderEventKey($key);
  47. $listeners = $object->get($key) ?: [];
  48. foreach ($listeners as $k => $listener) {
  49. list($callback, $once) = $listener;
  50. if ($once) {
  51. unset($listeners[$k]);
  52. }
  53. call_user_func($callback, $this, ...$params);
  54. }
  55. $object[$key] = $listeners;
  56. }
  57. /**
  58. * @param string $key
  59. * @param callable $callback
  60. * @param bool $once
  61. */
  62. protected static function setListeners($key, $callback, $once)
  63. {
  64. $object = app('admin.object');
  65. $key = static::formatBuilderEventKey($key);
  66. $listeners = $object->get($key) ?: [];
  67. $listeners[] = [$callback, $once];
  68. $object[$key] = $listeners;
  69. }
  70. protected static function formatBuilderEventKey($key)
  71. {
  72. return static::class.'::'.$key;
  73. }
  74. }