QueuedClosure.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace Illuminate\Events;
  3. use Closure;
  4. use Laravel\SerializableClosure\SerializableClosure;
  5. class QueuedClosure
  6. {
  7. /**
  8. * The underlying Closure.
  9. *
  10. * @var \Closure
  11. */
  12. public $closure;
  13. /**
  14. * The name of the connection the job should be sent to.
  15. *
  16. * @var string|null
  17. */
  18. public $connection;
  19. /**
  20. * The name of the queue the job should be sent to.
  21. *
  22. * @var string|null
  23. */
  24. public $queue;
  25. /**
  26. * The number of seconds before the job should be made available.
  27. *
  28. * @var \DateTimeInterface|\DateInterval|int|null
  29. */
  30. public $delay;
  31. /**
  32. * All of the "catch" callbacks for the queued closure.
  33. *
  34. * @var array
  35. */
  36. public $catchCallbacks = [];
  37. /**
  38. * Create a new queued closure event listener resolver.
  39. *
  40. * @param \Closure $closure
  41. * @return void
  42. */
  43. public function __construct(Closure $closure)
  44. {
  45. $this->closure = $closure;
  46. }
  47. /**
  48. * Set the desired connection for the job.
  49. *
  50. * @param string|null $connection
  51. * @return $this
  52. */
  53. public function onConnection($connection)
  54. {
  55. $this->connection = $connection;
  56. return $this;
  57. }
  58. /**
  59. * Set the desired queue for the job.
  60. *
  61. * @param string|null $queue
  62. * @return $this
  63. */
  64. public function onQueue($queue)
  65. {
  66. $this->queue = $queue;
  67. return $this;
  68. }
  69. /**
  70. * Set the desired delay in seconds for the job.
  71. *
  72. * @param \DateTimeInterface|\DateInterval|int|null $delay
  73. * @return $this
  74. */
  75. public function delay($delay)
  76. {
  77. $this->delay = $delay;
  78. return $this;
  79. }
  80. /**
  81. * Specify a callback that should be invoked if the queued listener job fails.
  82. *
  83. * @param \Closure $closure
  84. * @return $this
  85. */
  86. public function catch(Closure $closure)
  87. {
  88. $this->catchCallbacks[] = $closure;
  89. return $this;
  90. }
  91. /**
  92. * Resolve the actual event listener callback.
  93. *
  94. * @return \Closure
  95. */
  96. public function resolve()
  97. {
  98. return function (...$arguments) {
  99. dispatch(new CallQueuedListener(InvokeQueuedClosure::class, 'handle', [
  100. 'closure' => new SerializableClosure($this->closure),
  101. 'arguments' => $arguments,
  102. 'catch' => collect($this->catchCallbacks)->map(function ($callback) {
  103. return new SerializableClosure($callback);
  104. })->all(),
  105. ]))->onConnection($this->connection)->onQueue($this->queue)->delay($this->delay);
  106. };
  107. }
  108. }