1111use Yiisoft \Queue \Message \MessageInterface ;
1212use Yiisoft \Queue \Middleware \Push \AdapterPushHandler ;
1313use Yiisoft \Queue \Middleware \Push \PushHandlerInterface ;
14- use Yiisoft \Queue \Middleware \Push \PushMiddlewareInterface ;
14+ use Yiisoft \Queue \Middleware \Push \PushMiddlewareConfig ;
1515use Yiisoft \Queue \Middleware \Push \PushMiddlewareDispatcher ;
16+ use Yiisoft \Queue \Middleware \Push \PushMiddlewareInterface ;
1617use Yiisoft \Queue \Middleware \Push \SynchronousPushHandler ;
1718use Yiisoft \Queue \Worker \WorkerInterface ;
1819use Yiisoft \Queue \Message \IdEnvelope ;
@@ -25,13 +26,6 @@ final class Queue implements QueueInterface
2526 */
2627 private array $ middlewareDefinitions ;
2728
28- /**
29- * @var PushHandlerInterface The final push handler in the middleware chain, responsible
30- * for actually sending the message. Uses {@see SynchronousPushHandler} in synchronous mode or
31- * {@see AdapterPushHandler} otherwise.
32- */
33- private PushHandlerInterface $ finalPushHandler ;
34-
3529 private string $ name ;
3630
3731 /**
@@ -40,11 +34,18 @@ final class Queue implements QueueInterface
4034 */
4135 private PushMiddlewareDispatcher $ dispatcher ;
4236
37+ /**
38+ * @var PushMiddlewareDispatcher The base dispatcher built from {@see PushMiddlewareConfig}.
39+ * Holds the common middleware applied to all queues.
40+ */
41+ private PushMiddlewareDispatcher $ baseDispatcher ;
42+
4343 /**
4444 * @param WorkerInterface $worker The worker that processes messages.
4545 * @param LoopInterface $loop The loop for controlling message processing.
4646 * @param LoggerInterface $logger The logger for debug and informational messages.
47- * @param PushMiddlewareDispatcher $baseDispatcher The middleware dispatcher.
47+ * @param PushMiddlewareConfig $middlewareConfig The push middleware configuration: factory and common middleware
48+ * definitions.
4849 * @param AdapterInterface|null $adapter The message adapter (`null` for synchronous mode).
4950 * @param string|BackedEnum $name The queue name.
5051 * @param PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions Queue-specific middleware
@@ -54,19 +55,25 @@ public function __construct(
5455 private readonly WorkerInterface $ worker ,
5556 private readonly LoopInterface $ loop ,
5657 private readonly LoggerInterface $ logger ,
57- private readonly PushMiddlewareDispatcher $ baseDispatcher ,
58+ PushMiddlewareConfig $ middlewareConfig ,
5859 private readonly ?AdapterInterface $ adapter = null ,
5960 string |BackedEnum $ name = QueueProviderInterface::DEFAULT_QUEUE ,
6061 PushMiddlewareInterface |callable |array |string ...$ middlewareDefinitions ,
6162 ) {
6263 $ this ->name = StringNormalizer::normalize ($ name );
63- $ this ->finalPushHandler = $ this ->createFinalPushHandler ();
64+ $ this ->baseDispatcher = new PushMiddlewareDispatcher (
65+ $ middlewareConfig ->middlewareFactory ,
66+ $ middlewareConfig ->commonMiddlewareDefinitions ,
67+ $ this ->createFinalPushHandler (),
68+ );
6469 $ this ->setMiddlewaresAndPrepareDispatcher ($ middlewareDefinitions );
6570 }
6671
6772 public function __clone ()
6873 {
69- $ this ->finalPushHandler = $ this ->createFinalPushHandler ();
74+ $ finalPushHandler = $ this ->createFinalPushHandler ();
75+ $ this ->baseDispatcher = $ this ->baseDispatcher ->withFinishHandler ($ finalPushHandler );
76+ $ this ->dispatcher = $ this ->dispatcher ->withFinishHandler ($ finalPushHandler );
7077 }
7178
7279 public function getName (): string
@@ -81,7 +88,7 @@ public function push(MessageInterface $message): MessageInterface
8188 ['messageType ' => $ message ->getType ()],
8289 );
8390
84- $ message = $ this ->dispatcher ->dispatch ($ message, $ this -> finalPushHandler );
91+ $ message = $ this ->dispatcher ->dispatch ($ message );
8592
8693 if ($ this ->isSynchronous ()) {
8794 $ this ->logger ->info (
0 commit comments