为custom middlewares定义Symfony Messenger时,有时访问传输以处理消息和队列很有用。
例如,使用不同的参数重新排队消息,或者仅在处理成功后才删除消息,等等。
尝试了对TransportInterface
的类型提示:
class CustomMiddleware implements MiddlewareInterface {
/**
* @var \Symfony\Component\Messenger\Transport\TransportInterface
*/
private $transport;
public function __construct( TransportInterface $transport ) {
$this->transport = $transport;
}
public function handle( Envelope $envelope, StackInterface $stack ): Envelope {
// TODO: Implement handle() method.
return $envelope;
}
}
但是Symfony抱怨它不能自动连接服务:
无法自动装配服务“ App \ Messenger \ CustomMiddleware”:方法“ __construct()”的参数“ $ transport”引用接口“ Symfony \ Component \ Messenger \ Transport \ TransportInterface”,但不存在此类服务。您可能应该将此接口别名为以下现有服务之一:“ App \ Messenger \ SqsTransport”,“ messenger.transport.customsqs”。
SqsTransport
是指为此应用程序构建的自定义传输。 messenger.transport.customsqs
指的是其工厂定义的定义位置:
framework:
messenger:
transports:
customsqs: '%env(MESSENGER_TRANSPORT_DSN)%'
在这里有些困难,我认为这不是一个完全不寻常的用例,应该或多或少地直接找到我不知所措的解决方案。
由于SqsTransport
是由解释DSN的自定义TransportFactory
构建的,因此不能真正为其别名。
尝试显式定义CustomMiddleware
服务以引用@messenger.transport.customsqs
,但得到的结果完全相同:
services:
App\Messenger\CustomMiddleware:
arguments: ['@messenger.transport.customsqs']