在测试的时候,需要获取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);
相关视频教程