【问题标题】:Symfony Messenger Injection DoctrineSymfony Messenger 注入原则
【发布时间】:2022-11-06 03:41:46
【问题描述】:

我的项目需要帮助。 我尝试使用 Messenger 在我的服务 (SendInBlueService) 调用中注入实体管理器,但 DependencyInjection 找不到教义.orm.entity_manager。

我的测试路线

#[Route('api/testSendInBlue', name: 'testsendinblue')]
public function testMessenger(AsyncMethodService $asyncMethodService): Response
{
    $asyncMethodService->async_low_priority(
        SendInBlueService::class,
        'confirmationMail',
        [
            $this->getUser()->getId()
        ]
    );

    return new Response('Test OK');
}

我的异步方法服务

<?php

namespace App\Service\Messenger;

use Symfony\Component\Messenger\MessageBusInterface;

class AsyncMethodService
{
    private MessageBusInterface $messageBus;

    public function __construct(MessageBusInterface $messageBus)
    {
        $this->messageBus = $messageBus;
    }

    public function async_low_priority(string $serviceName, string $methodName,array $params = [])
    {
        $this->messageBus->dispatch(new ServiceMethodCallMessageLowPriority(
            $serviceName,
            $methodName,
            $params
            )
        );
    }
    public function async_medium_priority(string $serviceName, string $methodName,array $params = [])
    {
        $this->messageBus->dispatch(new ServiceMethodCallMessageMediumPriority(
            $serviceName,
            $methodName,
            $params
        )
        );
    }
    public function async_high_priority(string $serviceName, string $methodName,array $params = [])
    {
        $this->messageBus->dispatch(new ServiceMethodCallMessageHighPriority(
            $serviceName,
            $methodName,
            $params
        ));
    }
}

我的 ServiceMethodCallMessageLowPriority 与 High 和 Medium 完全相同

<?php

namespace App\Service\Messenger;

class ServiceMethodCallMessageLowPriority extends ServiceMethodCallMessage
{

}

我的 ServiceMethodCallMessage

<?php

namespace App\Service\Messenger;

class ServiceMethodCallMessage
{
    private string $serviceName;
    private string $methodName;
    private array $params;

    public function __construct(string $serviceName, string $methodName, array $params = [])
    {
        $this->serviceName = $serviceName;
        $this->methodName = $methodName;
        $this->params = $params;
    }

    /**
     * @return string
     */
    public function getServiceName(): string
    {
        return $this->serviceName;
    }

    /**
     * @return string
     */
    public function getMethodName(): string
    {
        return $this->methodName;
    }

    /**
     * @return array
     */
    public function getParams(): array
    {
        return $this->params;
    }
}

我的 MessengerHandle

<?php

namespace App\Service\Messenger;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

#[AsMessageHandler]
class ServiceMethodCallHandler extends AbstractController
{
    private string $path;

    public function __construct(string $path)
    {
        $this->path = $path;
    }

    public function __invoke(
        ServiceMethodCallMessageLowPriority |
        ServiceMethodCallMessageMediumPriority |
        ServiceMethodCallMessageHighPriority  $message
    )
    {
        $containerBuilder = new ContainerBuilder();
        $loader = new YamlFileLoader($containerBuilder, new FileLocator($this->path));
        $loader->load('services.yaml');

        $callable = [
            $containerBuilder->get($message->getServiceName()),
            $message->getMethodName()
        ];
        call_user_func_array($callable,$message->getParams());
    }
}

我的服务发送蓝色

<?php

namespace App\Service;

use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

class SendInBlueService
{
    private string $SEND_IN_BLUE_API_KEY;
    private EntityManagerInterface $entityManager;

    public function __construct(
        string $SEND_IN_BLUE_API_KEY,
        EntityManagerInterface $entityManager
    )
    {
        $this->SEND_IN_BLUE_API_KEY = $SEND_IN_BLUE_API_KEY;
        $this->entityManager = $entityManager;
    }

    public function confirmationMail(int $userId)
    {
        dd($this->entityManager);
        $user = $this->entityManager->getRepository(User::class)->find($userId);
        dd($user);
    }

}

我的 config/services.yaml

parameters:
    SEND_IN_BLUE_API_KEY: '%env(SEND_IN_BLUE_API_KEY)%'

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.

    App\:
        resource: '../src/'
        exclude:
            - '../src/Entity/'
            - '../src/Kernel.php'
            - '../src/DependencyInjection/'

    #    Messenger Declaration Service
    App\Service\Messenger\ServiceMethodCallHandler:
        arguments: ['%kernel.project_dir%/config']

    App\Service\SendInBlueService:
        class: App\Service\SendInBlueService
        arguments: ['%env(SEND_IN_BLUE_API_KEY)%','@doctrine.orm.entity_manager']

为了完成我的错误:

我尝试在我的服务中使用 ContainerBuilder 获取 EntityManager, 但我有同样的错误。

我认为我有一个问题,因为信使使用其他内核实例,并且在这个实例中,DependencyInjection 没有加载所有包。

如果有人有想法。 谢谢

【问题讨论】:

    标签: php symfony dependency-injection symfony-messenger


    【解决方案1】:

    我发现通过使用别名进行自动装配/依赖注入总是非常令人困惑(什么是可见的,什么是隐藏的,等等),并且通常选择使用默认参数绑定:

    https://symfony.com/doc/current/service_container.html#binding-arguments-by-name-or-type

    使用此方法,您将从 services.yaml 中完全删除服务(因为所有参数都是已知的),而是使用

    services:
        _defaults:
            bind: 
                string $SEND_IN_BLUE_API_KEY: '%env(SEND_IN_BLUE_API_KEY)%'
    

    如果实际上您加载的内核中缺少教义捆绑包,您必须找到一种方法来添加它。

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2019-06-04
      • 2014-09-23
      相关资源
      最近更新 更多