From 8e568c8fc7f78293f3ea4480923d89f60e933ab3 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 2 May 2026 21:04:02 +0300 Subject: [PATCH 1/5] Introduce `PushMiddlewareConfig` --- config/di.php | 6 +++--- docs/guide/en/configuration-manual.md | 6 +++--- docs/guide/en/synchronous-mode.md | 6 +++--- src/Middleware/Push/PushMiddlewareConfig.php | 21 +++++++++++++++++++ .../Push/PushMiddlewareDispatcher.php | 4 ++++ src/Queue.php | 18 +++++++++++++--- tests/Benchmark/QueueBench.php | 4 ++-- tests/Integration/MiddlewareTest.php | 12 ++++++----- tests/TestCase.php | 8 +++---- 9 files changed, 62 insertions(+), 23 deletions(-) create mode 100644 src/Middleware/Push/PushMiddlewareConfig.php diff --git a/config/di.php b/config/di.php index f7748b61..06de09e4 100644 --- a/config/di.php +++ b/config/di.php @@ -14,9 +14,9 @@ use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher; use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareFactory; use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareFactoryInterface; +use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig; use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactory; use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactoryInterface; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; use Yiisoft\Queue\Worker\Worker as QueueWorker; use Yiisoft\Queue\Worker\WorkerInterface; @@ -36,8 +36,8 @@ PushMiddlewareFactoryInterface::class => PushMiddlewareFactory::class, ConsumeMiddlewareFactoryInterface::class => ConsumeMiddlewareFactory::class, FailureMiddlewareFactoryInterface::class => FailureMiddlewareFactory::class, - PushMiddlewareDispatcher::class => [ - '__construct()' => ['middlewareDefinitions' => $params['yiisoft/queue']['middlewares-push']], + PushMiddlewareConfig::class => [ + '__construct()' => ['commonMiddlewareDefinitions' => $params['yiisoft/queue']['middlewares-push']], ], ConsumeMiddlewareDispatcher::class => [ '__construct()' => ['middlewareDefinitions' => $params['yiisoft/queue']['middlewares-consume']], diff --git a/docs/guide/en/configuration-manual.md b/docs/guide/en/configuration-manual.md index 220ee40d..f4d70346 100644 --- a/docs/guide/en/configuration-manual.md +++ b/docs/guide/en/configuration-manual.md @@ -22,8 +22,8 @@ use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareDispatcher; use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareFactory; use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher; use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareFactory; +use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig; use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactory; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; use Yiisoft\Queue\Queue; use Yiisoft\Queue\Worker\Worker; @@ -51,7 +51,7 @@ $failureMiddlewareDispatcher = new FailureMiddlewareDispatcher( [], ); -$pushMiddlewareDispatcher = new PushMiddlewareDispatcher( +$pushMiddlewareConfig = new PushMiddlewareConfig( new PushMiddlewareFactory($container, $callableFactory), ); @@ -75,7 +75,7 @@ $queue = new Queue( $worker, $loop, $logger, - $pushMiddlewareDispatcher, + $pushMiddlewareConfig, ); // Now you can push messages diff --git a/docs/guide/en/synchronous-mode.md b/docs/guide/en/synchronous-mode.md index 8fe4493a..ce110955 100644 --- a/docs/guide/en/synchronous-mode.md +++ b/docs/guide/en/synchronous-mode.md @@ -15,15 +15,15 @@ $logger = $DIContainer->get(\Psr\Log\LoggerInterface::class); $worker = $DIContainer->get(\Yiisoft\Queue\Worker\WorkerInterface::class); $loop = $DIContainer->get(\Yiisoft\Queue\Cli\LoopInterface::class); -$pushMiddlewareDispatcher = $DIContainer->get( - \Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher::class +$pushMiddlewareConfig = $DIContainer->get( + \Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig::class ); $queue = new Yiisoft\Queue\Queue( $worker, $loop, $logger, - $pushMiddlewareDispatcher, + $pushMiddlewareConfig, ); ``` diff --git a/src/Middleware/Push/PushMiddlewareConfig.php b/src/Middleware/Push/PushMiddlewareConfig.php new file mode 100644 index 00000000..848635aa --- /dev/null +++ b/src/Middleware/Push/PushMiddlewareConfig.php @@ -0,0 +1,21 @@ + $commonMiddlewareDefinitions Middleware definitions. + */ + public function __construct( + public readonly PushMiddlewareFactoryInterface $middlewareFactory, + public readonly array $commonMiddlewareDefinitions = [], + ) {} +} diff --git a/src/Middleware/Push/PushMiddlewareDispatcher.php b/src/Middleware/Push/PushMiddlewareDispatcher.php index b500740e..d8f583a7 100644 --- a/src/Middleware/Push/PushMiddlewareDispatcher.php +++ b/src/Middleware/Push/PushMiddlewareDispatcher.php @@ -6,7 +6,11 @@ use Closure; use Yiisoft\Queue\Message\MessageInterface; +use Yiisoft\Queue\Queue; +/** + * @internal Used internally by {@see Queue}. + */ final class PushMiddlewareDispatcher { /** diff --git a/src/Queue.php b/src/Queue.php index 8c389bf5..4c08be02 100644 --- a/src/Queue.php +++ b/src/Queue.php @@ -11,8 +11,9 @@ use Yiisoft\Queue\Message\MessageInterface; use Yiisoft\Queue\Middleware\Push\AdapterPushHandler; use Yiisoft\Queue\Middleware\Push\PushHandlerInterface; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareInterface; +use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig; use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; +use Yiisoft\Queue\Middleware\Push\PushMiddlewareInterface; use Yiisoft\Queue\Middleware\Push\SynchronousPushHandler; use Yiisoft\Queue\Worker\WorkerInterface; use Yiisoft\Queue\Message\IdEnvelope; @@ -40,11 +41,18 @@ final class Queue implements QueueInterface */ private PushMiddlewareDispatcher $dispatcher; + /** + * @var PushMiddlewareDispatcher The base dispatcher created from the {@see PushMiddlewareConfig} provided to + * the constructor. Holds the common middleware applied to all queues. + */ + private readonly PushMiddlewareDispatcher $baseDispatcher; + /** * @param WorkerInterface $worker The worker that processes messages. * @param LoopInterface $loop The loop for controlling message processing. * @param LoggerInterface $logger The logger for debug and informational messages. - * @param PushMiddlewareDispatcher $baseDispatcher The middleware dispatcher. + * @param PushMiddlewareConfig $middlewareConfig The push middleware configuration: factory and common middleware + * definitions. * @param AdapterInterface|null $adapter The message adapter (`null` for synchronous mode). * @param string|BackedEnum $name The queue name. * @param PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions Queue-specific middleware @@ -54,11 +62,15 @@ public function __construct( private readonly WorkerInterface $worker, private readonly LoopInterface $loop, private readonly LoggerInterface $logger, - private readonly PushMiddlewareDispatcher $baseDispatcher, + PushMiddlewareConfig $middlewareConfig, private readonly ?AdapterInterface $adapter = null, string|BackedEnum $name = QueueProviderInterface::DEFAULT_QUEUE, PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions, ) { + $this->baseDispatcher = new PushMiddlewareDispatcher( + $middlewareConfig->middlewareFactory, + ...$middlewareConfig->commonMiddlewareDefinitions, + ); $this->name = StringNormalizer::normalize($name); $this->finalPushHandler = $this->createFinalPushHandler(); $this->setMiddlewaresAndPrepareDispatcher($middlewareDefinitions); diff --git a/tests/Benchmark/QueueBench.php b/tests/Benchmark/QueueBench.php index e094f1e1..67a58a59 100644 --- a/tests/Benchmark/QueueBench.php +++ b/tests/Benchmark/QueueBench.php @@ -18,8 +18,8 @@ use Yiisoft\Queue\Middleware\FailureHandling\FailureEnvelope; use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher; use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareFactory; +use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig; use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactory; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; use Yiisoft\Queue\Queue; use Yiisoft\Queue\QueueInterface; use Yiisoft\Queue\Tests\Benchmark\Support\VoidAdapter; @@ -59,7 +59,7 @@ public function __construct() $worker, new SimpleLoop(0), $logger, - new PushMiddlewareDispatcher(new PushMiddlewareFactory($container, $callableFactory)), + new PushMiddlewareConfig(new PushMiddlewareFactory($container, $callableFactory)), $this->adapter, ); } diff --git a/tests/Integration/MiddlewareTest.php b/tests/Integration/MiddlewareTest.php index 1d583b52..308e01d2 100644 --- a/tests/Integration/MiddlewareTest.php +++ b/tests/Integration/MiddlewareTest.php @@ -23,8 +23,8 @@ use Yiisoft\Queue\Middleware\FailureHandling\Implementation\ExponentialDelayMiddleware; use Yiisoft\Queue\Middleware\FailureHandling\Implementation\SendAgainMiddleware; use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareFactory; +use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig; use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactory; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; use Yiisoft\Queue\Queue; use Yiisoft\Queue\QueueInterface; use Yiisoft\Queue\Tests\Integration\Support\TestMiddleware; @@ -45,15 +45,17 @@ public function testFullStackPush(): void 'channel 4', ]; - $pushMiddlewareDispatcher = new PushMiddlewareDispatcher( + $pushMiddlewareConfig = new PushMiddlewareConfig( new PushMiddlewareFactory( $this->createMock(ContainerInterface::class), new CallableFactory( $this->createMock(ContainerInterface::class), ), ), - new TestMiddleware('common 1'), - new TestMiddleware('common 2'), + [ + new TestMiddleware('common 1'), + new TestMiddleware('common 2'), + ], ); $worker = $this->createMock(WorkerInterface::class); $worker->method('process')->willReturnArgument(0); @@ -61,7 +63,7 @@ public function testFullStackPush(): void $worker, $this->createMock(LoopInterface::class), $this->createMock(LoggerInterface::class), - $pushMiddlewareDispatcher, + $pushMiddlewareConfig, name: 'test', ); $queue = $queue diff --git a/tests/TestCase.php b/tests/TestCase.php index 3c9f852c..45be8e54 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -20,8 +20,8 @@ use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareFactory; use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher; use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareFactory; +use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig; use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactory; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; use Yiisoft\Queue\Queue; use Yiisoft\Queue\Worker\Worker; use Yiisoft\Queue\Worker\WorkerInterface; @@ -97,7 +97,7 @@ protected function createQueue( $this->getWorker(), $this->getLoop(), new NullLogger(), - $this->getPushMiddlewareDispatcher(), + $this->getPushMiddlewareConfig(), $adapter, $name, ); @@ -158,9 +158,9 @@ protected function getMessageHandlers(): array ]; } - protected function getPushMiddlewareDispatcher(): PushMiddlewareDispatcher + protected function getPushMiddlewareConfig(): PushMiddlewareConfig { - return new PushMiddlewareDispatcher( + return new PushMiddlewareConfig( new PushMiddlewareFactory( $this->getContainer(), new CallableFactory($this->getContainer()), From 02d05ecf8c0ed40d14fa0586a6deae98e3e697b0 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 2 May 2026 21:27:20 +0300 Subject: [PATCH 2/5] Refactor `PushMiddlewareDispatcher` --- .../Push/PushMiddlewareDispatcher.php | 35 ++++++++++++------- src/Queue.php | 26 ++++++-------- .../Push/MiddlewareDispatcherTest.php | 31 ++++++++-------- 3 files changed, 47 insertions(+), 45 deletions(-) diff --git a/src/Middleware/Push/PushMiddlewareDispatcher.php b/src/Middleware/Push/PushMiddlewareDispatcher.php index d8f583a7..ea7fa119 100644 --- a/src/Middleware/Push/PushMiddlewareDispatcher.php +++ b/src/Middleware/Push/PushMiddlewareDispatcher.php @@ -19,30 +19,27 @@ final class PushMiddlewareDispatcher * @var PushMiddlewareStack|null The middleware stack. */ private ?PushMiddlewareStack $stack = null; + /** - * @var array[]|callable[]|PushMiddlewareInterface[]|string[] + * @param PushMiddlewareFactoryInterface $middlewareFactory Factory used to instantiate middleware. + * @param array $middlewareDefinitions Middleware definitions. + * @param PushHandlerInterface $finishHandler Handler to use when no middleware produces a response. */ - private array $middlewareDefinitions; - public function __construct( private readonly PushMiddlewareFactoryInterface $middlewareFactory, - array|callable|string|PushMiddlewareInterface ...$middlewareDefinitions, - ) { - $this->middlewareDefinitions = $middlewareDefinitions; - } + private array $middlewareDefinitions, + private PushHandlerInterface $finishHandler, + ) {} /** * Dispatch message through middleware to get response. * * @param MessageInterface $message Message to pass to middleware. - * @param PushHandlerInterface $finishHandler Handler to use in case no middleware produced a response. */ - public function dispatch( - MessageInterface $message, - PushHandlerInterface $finishHandler, - ): MessageInterface { + public function dispatch(MessageInterface $message): MessageInterface + { if ($this->stack === null) { - $this->stack = new PushMiddlewareStack($this->buildMiddlewares(), $finishHandler); + $this->stack = new PushMiddlewareStack($this->buildMiddlewares(), $this->finishHandler); } return $this->stack->handlePush($message); @@ -64,6 +61,18 @@ public function dispatch( * * @return self New instance of the {@see PushMiddlewareDispatcher} */ + public function withFinishHandler(PushHandlerInterface $finishHandler): self + { + $instance = clone $this; + $instance->finishHandler = $finishHandler; + + // Fixes a memory leak. + unset($instance->stack); + $instance->stack = null; + + return $instance; + } + public function withMiddlewares(array $middlewareDefinitions): self { $instance = clone $this; diff --git a/src/Queue.php b/src/Queue.php index 4c08be02..bcde010a 100644 --- a/src/Queue.php +++ b/src/Queue.php @@ -13,6 +13,7 @@ use Yiisoft\Queue\Middleware\Push\PushHandlerInterface; use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig; use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; +use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactoryInterface; use Yiisoft\Queue\Middleware\Push\PushMiddlewareInterface; use Yiisoft\Queue\Middleware\Push\SynchronousPushHandler; use Yiisoft\Queue\Worker\WorkerInterface; @@ -26,13 +27,6 @@ final class Queue implements QueueInterface */ private array $middlewareDefinitions; - /** - * @var PushHandlerInterface The final push handler in the middleware chain, responsible - * for actually sending the message. Uses {@see SynchronousPushHandler} in synchronous mode or - * {@see AdapterPushHandler} otherwise. - */ - private PushHandlerInterface $finalPushHandler; - private string $name; /** @@ -42,10 +36,10 @@ final class Queue implements QueueInterface private PushMiddlewareDispatcher $dispatcher; /** - * @var PushMiddlewareDispatcher The base dispatcher created from the {@see PushMiddlewareConfig} provided to - * the constructor. Holds the common middleware applied to all queues. + * @var PushMiddlewareDispatcher The base dispatcher built from {@see PushMiddlewareConfig}. + * Holds the common middleware applied to all queues. */ - private readonly PushMiddlewareDispatcher $baseDispatcher; + private PushMiddlewareDispatcher $baseDispatcher; /** * @param WorkerInterface $worker The worker that processes messages. @@ -67,18 +61,20 @@ public function __construct( string|BackedEnum $name = QueueProviderInterface::DEFAULT_QUEUE, PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions, ) { + $this->name = StringNormalizer::normalize($name); $this->baseDispatcher = new PushMiddlewareDispatcher( $middlewareConfig->middlewareFactory, - ...$middlewareConfig->commonMiddlewareDefinitions, + $middlewareConfig->commonMiddlewareDefinitions, + $this->createFinalPushHandler(), ); - $this->name = StringNormalizer::normalize($name); - $this->finalPushHandler = $this->createFinalPushHandler(); $this->setMiddlewaresAndPrepareDispatcher($middlewareDefinitions); } public function __clone() { - $this->finalPushHandler = $this->createFinalPushHandler(); + $finalPushHandler = $this->createFinalPushHandler(); + $this->baseDispatcher = $this->baseDispatcher->withFinishHandler($finalPushHandler); + $this->dispatcher = $this->dispatcher->withFinishHandler($finalPushHandler); } public function getName(): string @@ -93,7 +89,7 @@ public function push(MessageInterface $message): MessageInterface ['messageType' => $message->getType()], ); - $message = $this->dispatcher->dispatch($message, $this->finalPushHandler); + $message = $this->dispatcher->dispatch($message); if ($this->isSynchronous()) { $this->logger->info( diff --git a/tests/Unit/Middleware/Push/MiddlewareDispatcherTest.php b/tests/Unit/Middleware/Push/MiddlewareDispatcherTest.php index 6d26b259..ba80a425 100644 --- a/tests/Unit/Middleware/Push/MiddlewareDispatcherTest.php +++ b/tests/Unit/Middleware/Push/MiddlewareDispatcherTest.php @@ -33,7 +33,7 @@ static function (MessageInterface $message, PushHandlerInterface $handler): Mess ], ); - $result = $dispatcher->dispatch($message, $this->getRequestHandler()); + $result = $dispatcher->dispatch($message); $this->assertSame('New closure test data', $result->getData()); } @@ -46,7 +46,7 @@ public function testArrayMiddlewareCallableDefinition(): void ], ); $dispatcher = $this->createDispatcher($container)->withMiddlewares([[TestCallableMiddleware::class, 'index']]); - $result = $dispatcher->dispatch($message, $this->getRequestHandler()); + $result = $dispatcher->dispatch($message); $this->assertSame('New test data', $result->getData()); } @@ -59,7 +59,7 @@ public function testFactoryArrayDefinition(): void '__construct()' => ['message' => 'New test data from the definition'], ]; $dispatcher = $this->createDispatcher($container)->withMiddlewares([$definition]); - $result = $dispatcher->dispatch($message, $this->getRequestHandler()); + $result = $dispatcher->dispatch($message); $this->assertSame('New test data from the definition', $result->getData()); } @@ -76,7 +76,7 @@ public function testMiddlewareFullStackCalled(): void $dispatcher = $this->createDispatcher()->withMiddlewares([$middleware1, $middleware2]); - $result = $dispatcher->dispatch($message, $this->getRequestHandler()); + $result = $dispatcher->dispatch($message); $this->assertSame('new test data', $result->getData()); } @@ -89,7 +89,7 @@ public function testMiddlewareStackInterrupted(): void $dispatcher = $this->createDispatcher()->withMiddlewares([$middleware1, $middleware2]); - $result = $dispatcher->dispatch($message, $this->getRequestHandler()); + $result = $dispatcher->dispatch($message); $this->assertSame('first', $result->getData()); } @@ -129,24 +129,14 @@ public function testResetStackOnWithMiddlewares(): void $dispatcher = $this ->createDispatcher($container) ->withMiddlewares([[TestCallableMiddleware::class, 'index']]); - $dispatcher->dispatch($message, $this->getRequestHandler()); + $dispatcher->dispatch($message); $dispatcher = $dispatcher->withMiddlewares([TestMiddleware::class]); - $result = $dispatcher->dispatch($message, $this->getRequestHandler()); + $result = $dispatcher->dispatch($message); self::assertSame('New middleware test data', $result->getData()); } - private function getRequestHandler(): PushHandlerInterface - { - return new class implements PushHandlerInterface { - public function handlePush(MessageInterface $message): MessageInterface - { - return $message; - } - }; - } - private function createDispatcher( ?ContainerInterface $container = null, ): PushMiddlewareDispatcher { @@ -155,6 +145,13 @@ private function createDispatcher( return new PushMiddlewareDispatcher( new PushMiddlewareFactory($container, $callableFactory), + [], + new class implements PushHandlerInterface { + public function handlePush(MessageInterface $message): MessageInterface + { + return $message; + } + }, ); } From 859b540d43a38a4d04a3aeb70a6c2e7fc82a4c9a Mon Sep 17 00:00:00 2001 From: vjik <525501+vjik@users.noreply.github.com> Date: Sat, 2 May 2026 18:29:27 +0000 Subject: [PATCH 3/5] Apply PHP CS Fixer and Rector changes (CI) --- src/Queue.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Queue.php b/src/Queue.php index bcde010a..2da7e615 100644 --- a/src/Queue.php +++ b/src/Queue.php @@ -13,7 +13,6 @@ use Yiisoft\Queue\Middleware\Push\PushHandlerInterface; use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig; use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactoryInterface; use Yiisoft\Queue\Middleware\Push\PushMiddlewareInterface; use Yiisoft\Queue\Middleware\Push\SynchronousPushHandler; use Yiisoft\Queue\Worker\WorkerInterface; From 800082de6ccffbcb5264c322821c07f6a0b953c7 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 2 May 2026 21:30:17 +0300 Subject: [PATCH 4/5] fix phpdoc --- src/Middleware/Push/PushMiddlewareDispatcher.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Middleware/Push/PushMiddlewareDispatcher.php b/src/Middleware/Push/PushMiddlewareDispatcher.php index ea7fa119..37a6b57c 100644 --- a/src/Middleware/Push/PushMiddlewareDispatcher.php +++ b/src/Middleware/Push/PushMiddlewareDispatcher.php @@ -23,7 +23,7 @@ final class PushMiddlewareDispatcher /** * @param PushMiddlewareFactoryInterface $middlewareFactory Factory used to instantiate middleware. * @param array $middlewareDefinitions Middleware definitions. - * @param PushHandlerInterface $finishHandler Handler to use when no middleware produces a response. + * @param PushHandlerInterface $finishHandler Finish message handler. */ public function __construct( private readonly PushMiddlewareFactoryInterface $middlewareFactory, From e1b82d5802e7868f3cd9b3fcf2d0bb76b83c662e Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 2 May 2026 21:33:44 +0300 Subject: [PATCH 5/5] fix phpdoc --- .../Push/PushMiddlewareDispatcher.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Middleware/Push/PushMiddlewareDispatcher.php b/src/Middleware/Push/PushMiddlewareDispatcher.php index 37a6b57c..697b25d4 100644 --- a/src/Middleware/Push/PushMiddlewareDispatcher.php +++ b/src/Middleware/Push/PushMiddlewareDispatcher.php @@ -45,6 +45,18 @@ public function dispatch(MessageInterface $message): MessageInterface return $this->stack->handlePush($message); } + public function withFinishHandler(PushHandlerInterface $finishHandler): self + { + $instance = clone $this; + $instance->finishHandler = $finishHandler; + + // Fixes a memory leak. + unset($instance->stack); + $instance->stack = null; + + return $instance; + } + /** * Returns new instance with middleware handlers replaced with the ones provided. * @@ -61,18 +73,6 @@ public function dispatch(MessageInterface $message): MessageInterface * * @return self New instance of the {@see PushMiddlewareDispatcher} */ - public function withFinishHandler(PushHandlerInterface $finishHandler): self - { - $instance = clone $this; - $instance->finishHandler = $finishHandler; - - // Fixes a memory leak. - unset($instance->stack); - $instance->stack = null; - - return $instance; - } - public function withMiddlewares(array $middlewareDefinitions): self { $instance = clone $this;