Skip to content

Commit e07c320

Browse files
committed
Use mixed as push middleware definition format
1 parent c529da1 commit e07c320

9 files changed

Lines changed: 44 additions & 49 deletions

docs/guide/en/middleware-pipelines.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ You can use any of these formats:
6161
- A string for your DI container to resolve the middleware, e.g. `FooMiddleware::class`.
6262
- An [extended callable definition](callable-definitions-extended.md). A callable should either be a middleware itself or return a configured middleware object.
6363

64+
> **Note:** The formats above are supported by the default `PushMiddlewareFactory`. When using a custom
65+
> `PushMiddlewareFactoryInterface` implementation, it may accept additional definition formats.
66+
6467
The required interface depends on the pipeline:
6568

6669
- Push: `Yiisoft\Queue\Middleware\Push\PushMiddlewareInterface`

src/Debug/QueueDecorator.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use Yiisoft\Queue\MessageStatus;
88
use Yiisoft\Queue\Message\MessageInterface;
9-
use Yiisoft\Queue\Middleware\Push\PushMiddlewareInterface;
109
use Yiisoft\Queue\QueueInterface;
1110

1211
final class QueueDecorator implements QueueInterface
@@ -46,12 +45,12 @@ public function getName(): string
4645
return $this->queue->getName();
4746
}
4847

49-
public function withMiddlewares(PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions): self
48+
public function withMiddlewares(mixed ...$middlewareDefinitions): self
5049
{
5150
return new self($this->queue->withMiddlewares(...$middlewareDefinitions), $this->collector);
5251
}
5352

54-
public function withMiddlewaresAdded(PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions): self
53+
public function withMiddlewaresAdded(mixed ...$middlewareDefinitions): self
5554
{
5655
return new self($this->queue->withMiddlewaresAdded(...$middlewareDefinitions), $this->collector);
5756
}

src/Middleware/Push/PushMiddlewareConfig.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ final class PushMiddlewareConfig
1212
{
1313
/**
1414
* @param PushMiddlewareFactoryInterface $middlewareFactory Factory used to instantiate middleware from definitions.
15-
* @param array<array|callable|PushMiddlewareInterface|string> $commonMiddlewareDefinitions Middleware definitions.
15+
* @param mixed[] $commonMiddlewareDefinitions Middleware definitions.
1616
*/
1717
public function __construct(
1818
public readonly PushMiddlewareFactoryInterface $middlewareFactory,

src/Middleware/Push/PushMiddlewareDispatcher.php

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ final class PushMiddlewareDispatcher
2222

2323
/**
2424
* @param PushMiddlewareFactoryInterface $middlewareFactory Factory used to instantiate middleware.
25-
* @param array<array|callable|PushMiddlewareInterface|string> $middlewareDefinitions Middleware definitions.
25+
* @param mixed[] $middlewareDefinitions Middleware definitions.
2626
* @param PushHandlerInterface $finishHandler Finish message handler.
2727
*/
2828
public function __construct(
@@ -60,16 +60,7 @@ public function withFinishHandler(PushHandlerInterface $finishHandler): self
6060
/**
6161
* Returns new instance with middleware handlers replaced with the ones provided.
6262
*
63-
* @param array[]|callable[]|PushMiddlewareInterface[]|string[] $middlewareDefinitions Each array element is:
64-
*
65-
* - A name of a middleware class. The middleware instance will be obtained from container executed.
66-
* - A callable with `function(MessageInterface $message, PushHandlerInterface $handler):
67-
* MessageInterface` signature.
68-
* - A "callable-like" array in format `[FooMiddleware::class, 'index']`. `FooMiddleware` instance will
69-
* be created and `index()` method will be executed.
70-
* - A function returning a middleware. The middleware returned will be executed.
71-
*
72-
* For callables typed parameters are automatically injected using dependency injection container.
63+
* @param mixed[] $middlewareDefinitions Middleware definitions.
7364
*
7465
* @return self New instance of the {@see PushMiddlewareDispatcher}
7566
*/
@@ -88,16 +79,7 @@ public function withMiddlewares(array $middlewareDefinitions): self
8879
/**
8980
* Returns a new instance with additional middleware handlers added to the existing ones.
9081
*
91-
* @param array[]|callable[]|PushMiddlewareInterface[]|string[] $middlewareDefinitions Each array element is:
92-
*
93-
* - A name of a middleware class. The middleware instance will be obtained from container executed.
94-
* - A callable with `function(MessageInterface $message, PushHandlerInterface $handler):
95-
* MessageInterface` signature.
96-
* - A "callable-like" array in format `[FooMiddleware::class, 'index']`. `FooMiddleware` instance will
97-
* be created and `index()` method will be executed.
98-
* - A function returning a middleware. The middleware returned will be executed.
99-
*
100-
* For callables typed parameters are automatically injected using dependency injection container.
82+
* @param mixed[] $middlewareDefinitions Middleware definitions.
10183
*
10284
* @return self New instance of the {@see PushMiddlewareDispatcher}
10385
*/

src/Middleware/Push/PushMiddlewareFactory.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,20 @@
1010
use Yiisoft\Queue\Middleware\InvalidMiddlewareDefinitionException;
1111
use Yiisoft\Queue\Middleware\MiddlewareFactory;
1212

13+
use function is_array;
14+
use function is_callable;
15+
use function is_string;
16+
1317
/**
1418
* Creates a middleware based on the definition provided.
1519
*
1620
* @template-extends MiddlewareFactory<PushMiddlewareInterface>
21+
* @template-implements PushMiddlewareFactoryInterface<PushMiddlewareInterface|array|callable|string>
1722
*/
1823
final class PushMiddlewareFactory extends MiddlewareFactory implements PushMiddlewareFactoryInterface
1924
{
2025
/**
21-
* @param PushMiddlewareInterface|callable|array|string $middlewareDefinition Middleware definition in one of
22-
* the following formats:
26+
* @param mixed $middlewareDefinition Middleware definition in one of the following formats:
2327
*
2428
* - A middleware object.
2529
* - A name of a middleware class. The middleware instance will be obtained from container and executed.
@@ -38,13 +42,16 @@ final class PushMiddlewareFactory extends MiddlewareFactory implements PushMiddl
3842
*
3943
* @return PushMiddlewareInterface
4044
*/
41-
public function createPushMiddleware(
42-
PushMiddlewareInterface|callable|array|string $middlewareDefinition,
43-
): PushMiddlewareInterface {
45+
public function createPushMiddleware(mixed $middlewareDefinition): PushMiddlewareInterface
46+
{
4447
if ($middlewareDefinition instanceof PushMiddlewareInterface) {
4548
return $middlewareDefinition;
4649
}
4750

51+
if (!is_callable($middlewareDefinition) && !is_array($middlewareDefinition) && !is_string($middlewareDefinition)) {
52+
throw new InvalidMiddlewareDefinitionException($middlewareDefinition);
53+
}
54+
4855
$middleware = $this->create($middlewareDefinition);
4956

5057
if (!$middleware instanceof PushMiddlewareInterface) {

src/Middleware/Push/PushMiddlewareFactoryInterface.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,27 @@
44

55
namespace Yiisoft\Queue\Middleware\Push;
66

7+
use Yiisoft\Queue\Middleware\InvalidMiddlewareDefinitionException;
8+
79
/**
810
* Creates a middleware based on the definition provided.
911
* You may implement this interface if you want to introduce custom definitions or pass additional data to
1012
* the middleware created.
13+
*
14+
* @template T
1115
*/
1216
interface PushMiddlewareFactoryInterface
1317
{
1418
/**
15-
* Create a middleware based on definition provided.
19+
* Create a middleware based on the definition provided.
20+
*
21+
* @param mixed $middlewareDefinition Middleware definition to use.
1622
*
17-
* @param array|callable|PushMiddlewareInterface|string $middlewareDefinition Middleware definition to use.
23+
* @throws InvalidMiddlewareDefinitionException If the definition is not supported or is invalid.
1824
*
1925
* @return PushMiddlewareInterface
26+
*
27+
* @psalm-param T $middlewareDefinition
2028
*/
21-
public function createPushMiddleware(callable|array|string|PushMiddlewareInterface $middlewareDefinition): PushMiddlewareInterface;
29+
public function createPushMiddleware(mixed $middlewareDefinition): PushMiddlewareInterface;
2230
}

src/Queue.php

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
use Yiisoft\Queue\Middleware\Push\PushHandlerInterface;
1414
use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig;
1515
use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher;
16-
use Yiisoft\Queue\Middleware\Push\PushMiddlewareInterface;
1716
use Yiisoft\Queue\Middleware\Push\SynchronousPushHandler;
1817
use Yiisoft\Queue\Worker\WorkerInterface;
1918
use Yiisoft\Queue\Message\IdEnvelope;
@@ -22,7 +21,7 @@
2221
final class Queue implements QueueInterface
2322
{
2423
/**
25-
* @var array<array|callable|PushMiddlewareInterface|string> Queue-specific middleware definitions.
24+
* @var mixed[] Queue-specific middleware definitions.
2625
*/
2726
private array $middlewareDefinitions;
2827

@@ -48,8 +47,7 @@ final class Queue implements QueueInterface
4847
* definitions.
4948
* @param AdapterInterface|null $adapter The message adapter (`null` for synchronous mode).
5049
* @param string|BackedEnum $name The queue name.
51-
* @param PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions Queue-specific middleware
52-
* definitions.
50+
* @param mixed ...$middlewareDefinitions Queue-specific middleware definitions.
5351
*/
5452
public function __construct(
5553
private readonly WorkerInterface $worker,
@@ -58,7 +56,7 @@ public function __construct(
5856
PushMiddlewareConfig $middlewareConfig,
5957
private readonly ?AdapterInterface $adapter = null,
6058
string|BackedEnum $name = QueueProviderInterface::DEFAULT_QUEUE,
61-
PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions,
59+
mixed ...$middlewareDefinitions,
6260
) {
6361
$this->name = StringNormalizer::normalize($name);
6462
$this->baseDispatcher = new PushMiddlewareDispatcher(
@@ -160,22 +158,22 @@ public function status(string|int $id): MessageStatus
160158
return $this->adapter->status($id);
161159
}
162160

163-
public function withMiddlewares(PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions): self
161+
public function withMiddlewares(mixed ...$middlewareDefinitions): self
164162
{
165163
$instance = clone $this;
166164
$instance->setMiddlewaresAndPrepareDispatcher($middlewareDefinitions);
167165
return $instance;
168166
}
169167

170-
public function withMiddlewaresAdded(PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions): self
168+
public function withMiddlewaresAdded(mixed ...$middlewareDefinitions): self
171169
{
172170
$instance = clone $this;
173171
$instance->setMiddlewaresAndPrepareDispatcher([...array_values($instance->middlewareDefinitions), ...array_values($middlewareDefinitions)]);
174172
return $instance;
175173
}
176174

177175
/**
178-
* @param array<PushMiddlewareInterface|callable|array|string> $middlewareDefinitions
176+
* @param mixed[] $middlewareDefinitions
179177
*/
180178
private function setMiddlewaresAndPrepareDispatcher(array $middlewareDefinitions): void
181179
{

src/QueueInterface.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace Yiisoft\Queue;
66

77
use Yiisoft\Queue\Message\MessageInterface;
8-
use Yiisoft\Queue\Middleware\Push\PushMiddlewareInterface;
98

109
interface QueueInterface
1110
{
@@ -45,14 +44,14 @@ public function getName(): string;
4544
/**
4645
* Creates a new instance with the specified middlewares. All the existing middlewares are replaced.
4746
*
48-
* @param PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions The middleware definitions.
47+
* @param mixed ...$middlewareDefinitions The middleware definitions.
4948
*/
50-
public function withMiddlewares(PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions): self;
49+
public function withMiddlewares(mixed ...$middlewareDefinitions): self;
5150

5251
/**
5352
* Creates a new instance with the specified middlewares added after the existing ones.
5453
*
55-
* @param PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions The middleware definitions.
54+
* @param mixed ...$middlewareDefinitions The middleware definitions.
5655
*/
57-
public function withMiddlewaresAdded(PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions): self;
56+
public function withMiddlewaresAdded(mixed ...$middlewareDefinitions): self;
5857
}

stubs/StubQueue.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use Yiisoft\Queue\MessageStatus;
88
use Yiisoft\Queue\Message\MessageInterface;
9-
use Yiisoft\Queue\Middleware\Push\PushMiddlewareInterface;
109
use Yiisoft\Queue\QueueInterface;
1110

1211
/**
@@ -40,12 +39,12 @@ public function getName(): string
4039
return $this->name;
4140
}
4241

43-
public function withMiddlewares(PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions): self
42+
public function withMiddlewares(mixed ...$middlewareDefinitions): self
4443
{
4544
return $this;
4645
}
4746

48-
public function withMiddlewaresAdded(PushMiddlewareInterface|callable|array|string ...$middlewareDefinitions): self
47+
public function withMiddlewaresAdded(mixed ...$middlewareDefinitions): self
4948
{
5049
return $this;
5150
}

0 commit comments

Comments
 (0)