在Symfony中如何获取所有的message handler

在测试的时候,需要获取symfony的里所有的的message handler,该如何做到呢?

通过 messenger.message_hanlder 就可以。

比如你的测试需要测试所有的 message handler

1 在容器中注册一个provider ,比如 MessengerHanlderProvider

  App\Tests\Functional\StaticCodeAnalysis\MessengerHandlerProvider:
    public: true
    arguments:
      $handlers: !tagged_iterator messenger.message_handler
2 然后实现该provider类 class App\Tests\Functional\StaticCodeAnalysis\MessengerHandlerProvider ,它只有一个作用,就是接受一个返回所有handler迭代器,它的构造函数的为 !tagged_iterator messenger.message_handler
  public function __construct(iterable $handlers)
    {
        $this->handlers = iterator_to_array($handlers);
    }

意思就是返回给我所有的tag标记部位MessageHandler的类。因为我们在用Messenger定义消息的hanlder的时候,都按照教程,给每个定义为hanlder的类加上这个标签。比如:

#[AsMessageHandler]
readonly class FinalizeCancellationsHandler
{... }

#[AsMessageHandler]
class SyncCancellationsHandler
{...}

这样就可以轻松获取所有的messenger 的handler了。

3 在测试中需要用到返回所有消息handler的时候,只要问容器去要就可以了。比如

static::getContainer()->get(MessengerHandlerProvider::class);

相关视频教程

https://symfonycasts.com/screencast/messenger/message-class