2424
2525class CloudTasksQueue extends LaravelQueue implements QueueContract
2626{
27- private Closure |array $ headers = [];
27+ private static ?Closure $ handlerUrlCallback = null ;
28+ private static ?Closure $ taskHeadersCallback = null ;
2829
2930 public function __construct (public array $ config , public CloudTasksClient $ client , public $ dispatchAfterCommit = false )
3031 {
3132 //
3233 }
34+
35+ public static function configureHandlerUrlUsing (Closure $ callback ): void
36+ {
37+ static ::$ handlerUrlCallback = $ callback ;
38+ }
39+
40+ public static function forgetHandlerUrlCallback (): void
41+ {
42+ self ::$ handlerUrlCallback = null ;
43+ }
44+
45+ public static function setTaskHeadersUsing (Closure $ callback ): void
46+ {
47+ static ::$ taskHeadersCallback = $ callback ;
48+ }
49+
50+ public static function forgetTaskHeadersCallback (): void
51+ {
52+ self ::$ taskHeadersCallback = null ;
53+ }
3354
3455 /**
3556 * Get the size of the queue.
@@ -57,8 +78,8 @@ public function push($job, $data = '', $queue = null)
5778 $ this ->createPayload ($ job , $ queue , $ data ),
5879 $ queue ,
5980 null ,
60- function ($ payload , $ queue ) {
61- return $ this ->pushRaw ($ payload , $ queue );
81+ function ($ payload , $ queue ) use ( $ job ) {
82+ return $ this ->pushRaw ($ payload , $ queue, [ ' job ' => $ job ] );
6283 }
6384 );
6485 }
@@ -73,8 +94,9 @@ function ($payload, $queue) {
7394 public function pushRaw ($ payload , $ queue = null , array $ options = [])
7495 {
7596 $ delay = ! empty ($ options ['delay ' ]) ? $ options ['delay ' ] : 0 ;
97+ $ job = $ options ['job ' ] ?? null ;
7698
77- return $ this ->pushToCloudTasks ($ queue , $ payload , $ delay );
99+ return $ this ->pushToCloudTasks ($ queue , $ payload , $ delay, $ job );
78100 }
79101
80102 /**
@@ -93,8 +115,8 @@ public function later($delay, $job, $data = '', $queue = null)
93115 $ this ->createPayload ($ job , $ queue , $ data ),
94116 $ queue ,
95117 $ delay ,
96- function ($ payload , $ queue , $ delay ) {
97- return $ this ->pushToCloudTasks ($ queue , $ payload , $ delay );
118+ function ($ payload , $ queue , $ delay ) use ( $ job ) {
119+ return $ this ->pushToCloudTasks ($ queue , $ payload , $ delay, $ job );
98120 }
99121 );
100122 }
@@ -105,9 +127,10 @@ function ($payload, $queue, $delay) {
105127 * @param string|null $queue
106128 * @param string $payload
107129 * @param \DateTimeInterface|\DateInterval|int $delay
130+ * @param string|object $job
108131 * @return string
109132 */
110- protected function pushToCloudTasks ($ queue , $ payload , $ delay = 0 )
133+ protected function pushToCloudTasks ($ queue , $ payload , $ delay, mixed $ job )
111134 {
112135 $ queue = $ queue ?: $ this ->config ['queue ' ];
113136
@@ -122,7 +145,7 @@ protected function pushToCloudTasks($queue, $payload, $delay = 0)
122145 connectionName: $ this ->getConnectionName (),
123146 );
124147
125- $ this ->addPayloadToTask ($ payload , $ task );
148+ $ this ->addPayloadToTask ($ payload , $ task, $ job );
126149
127150 // The deadline for requests sent to the app. If the app does not respond by
128151 // this deadline then the request is cancelled and the attempt is marked as
@@ -173,9 +196,10 @@ private function enrichPayloadWithInternalData(
173196 return $ payload ;
174197 }
175198
176- public function addPayloadToTask (array $ payload , Task $ task ): Task
199+ /** @param string|object $job */
200+ public function addPayloadToTask (array $ payload , Task $ task , mixed $ job ): Task
177201 {
178- $ headers = value ( $ this ->headers , $ payload ) ?: [] ;
202+ $ headers = $ this ->headers ( $ payload );
179203
180204 if (! empty ($ this ->config ['app_engine ' ])) {
181205 $ path = \Safe \parse_url (route ('cloud-tasks.handle-task ' ), PHP_URL_PATH );
@@ -195,7 +219,7 @@ public function addPayloadToTask(array $payload, Task $task): Task
195219 $ task ->setAppEngineHttpRequest ($ appEngineRequest );
196220 } else {
197221 $ httpRequest = new HttpRequest ();
198- $ httpRequest ->setUrl ($ this ->getHandler ());
222+ $ httpRequest ->setUrl ($ this ->getHandler ($ job ));
199223 $ httpRequest ->setBody (json_encode ($ payload ));
200224 $ httpRequest ->setHttpMethod (HttpMethod::POST );
201225 $ httpRequest ->setHeaders ($ headers );
@@ -225,12 +249,17 @@ public function release(CloudTasksJob $job, int $delay = 0): void
225249 $ this ->pushRaw (
226250 payload: $ job ->getRawBody (),
227251 queue: $ job ->getQueue (),
228- options: ['delay ' => $ delay]
252+ options: ['delay ' => $ delay, ' job ' => $ job ],
229253 );
230254 }
231255
232- public function getHandler (): string
256+ /** @param string|object $job */
257+ public function getHandler (mixed $ job ): string
233258 {
259+ if (static ::$ handlerUrlCallback ) {
260+ return (static ::$ handlerUrlCallback )($ job );
261+ }
262+
234263 if (empty ($ this ->config ['handler ' ])) {
235264 $ this ->config ['handler ' ] = request ()->getSchemeAndHttpHost ();
236265 }
@@ -244,8 +273,16 @@ public function getHandler(): string
244273 return $ handler .'/ ' .config ('cloud-tasks.uri ' );
245274 }
246275
247- public function setTaskHeaders (Closure |array $ headers ): void
276+ /**
277+ * @param array<string, mixed> $payload
278+ * @return array<string, mixed>
279+ */
280+ private function headers (mixed $ payload ): array
248281 {
249- $ this ->headers = $ headers ;
282+ if (!static ::$ taskHeadersCallback ) {
283+ return [];
284+ }
285+
286+ return (static ::$ taskHeadersCallback )($ payload );
250287 }
251288}
0 commit comments