我使用的是API平台3.1.我需要在创建后生成一些实体的缩略图.我想使用Symfony Messenger来触发它,并异步完成它,因为它可能需要一些时间来处理,但我希望立即保存实体.
当资源同时使用Messenger和自定义处理器(以保存实体)时,如果使用messenger=true
,则不创建消息;如果使用messenger='input'
,则不调用处理器.
How to reproduce个
#[ORM\Entity]
#[ApiResource(
operations: [
new Post(
processor: MyEntityProcessor::class,
messenger: 'input',
deserialize: false,
)
]
)]
class MyEntity
{
}
final class MyEntityProcessor implements ProcessorInterface
{
public function __construct(private ProcessorInterface $persistProcessor)
{
}
public function process($data, Operation $operation, array $uriVariables = [], array $context = [])
{
$result = $this->persistProcessor->process($data, $operation, $uriVariables, $context);
return $result;
}
}
final class MyEntityHandler implements MessageHandlerInterface
{
public function __construct(private EntityManagerInterface $entityManager)
{
}
public function __invoke(MyEntity $myEntity)
{
// my long running function
$this->entityManager->persist($myEntity);
$this->entityManager->flush();
}
}
services.yaml个
services:
App\State\MyEntityProcessor:
bind:
$persistProcessor: '@api_platform.doctrine.orm.state.item_provider'
messenger.yaml个
framework:
messenger:
transports:
async: 'doctrine://default'
routing:
'App\Entity\MyEntity': async
API平台文档在Symfony Messenger Integration篇文章中提到:
注意:在Doctrine实体中使用
messenger=true
ApiResource属性时,不会调用Doctrine处理器.如果您希望Doctrine处理器被调用,您应该decorate a built-in state processor并实现您自己的逻辑.
这是suggested on a GitHub issue,我应该装饰信使处理程序,以拯救实体.然而,我需要立即保存我的实体,而不是等待它被messenger:consume
工作人员使用.