繁体   English   中英

Symfony 5 中参数注入的自动装配问题

[英]Autowiring problem with parameter injection in Symfony 5

我在尝试从 Symfony 5 中的控制器检索管理器时遇到了麻烦。

我在src/Manager/MailerManager.php有这个src/Manager/MailerManager.php

<?php
namespace App\Manager;

use App\Client\MailjetClient;

class MailerManager {
    private $mailjetClient;     

    function __construct(MailjetClient $mailjetClient) {
        $this->setMailjetClient($mailjetClient);        
    }

    function send($data) {

    }

    function getMailjetClient() {
        return $this->mailjetClient;
    }

    private function setMailjetClient($mailjetClient) {
        $this->mailjetClient = $mailjetClient;
    }

}

这个管理器需要注入src/Client/MailjetClient.php才能工作,它有这个代码:

<?php
namespace App\Client;

use \Mailjet\Resources;

class MailjetClient {
    private $client;    

    function __construct(string $apikey, string $apisecret) {                       
        $this->setClient($apikey, $apisecret);      
    }               

    function getClient() {
        return $this->client;
    }

    function setClient($apikey, $apisecret) {
        $this->client = new \Mailjet\Client($apikey, $apisecret);
    }
}

这只是通过 composer 安装的 mailjet sdk 的包装器,需要根据环境提供不同的$apikey$apisecret ,对于我通过services.yaml文件使用的参数,我还启用了自动装配MailjetClientMailerManager和服务定义:

parameters:
    rabbitmq:
        host: '%env(RABBITMQ_HOST)%'
        port: '%env(RABBITMQ_PORT)%'
        user: '%env(RABBITMQ_USER)%'
        pwd: '%env(RABBITMQ_PWD)%'
    mailjet:
        apikey: '%env(MAILJET_APIKEY)%'
        apisecret: '%env(MAILJET_APISECRET)%'

services:
    _defaults:
        autowire: true
        autoconfigure: true
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    App\Client\MailjetClient\:
        resource: '../src/Client/MailjetClient.php'
        arguments:
            $apikey: '%mailjet.host%'
            $apisecret: '%mailjet.port%'        

    App\Manager\MailerManager\:
        resource: '../src/Manager/MailerManager.php'        
        arguments:
            $mailjetClient: '@client.mailjet'            

我遇到的问题是我收到此错误: Cannot autowire service "App\\Client\\MailjetClient": argument "$apikey" of method "__construct()" is type-hinted "string", you should configure its value explicitly. 当我尝试在src/Controller/MailerController.php控制器中注入MailManager时:

<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Manager\MailerManager;

class MailerController extends AbstractController
{
    /**
     * @Route("/compose", name="compose")
     */
    public function compose(MailerManager $mailerManager) 
    {        
        dump($mailerManager);die();
        }
    }       
}

可能有什么问题? 我来自 Symfony 2,这个参数注入是标准的东西,曾经像魅力一样工作,现在我对如何将自动装配与服务手册定义混合在一起感到非常困惑。

由于 u_mulder 和 Tejas Gosai 提示我终于可以将其投入使用,我在services.yml方面遇到了彻底的灾难。 我在注入的参数上有一些类型错误,不需要MailManager.php特定声明,并且我的客户端命名空间不应以建议的\\ ad u_mulder 结尾。

最后,使用这个services.yml它可以工作:

parameters:
    rabbitmq.host: '%env(RABBITMQ_HOST)%'
    rabbitmq.port: '%env(RABBITMQ_PORT)%'
    rabbitmq.user: '%env(RABBITMQ_USER)%'
    rabbitmq.pwd: '%env(RABBITMQ_PWD)%'
    mailjet.apikey: '%env(MAILJET_APIKEY)%'
    mailjet.apisecret: '%env(MAILJET_APISECRET)%'
services:
    _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/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']
    App\Client\MailjetClient:        
        arguments:
            $apikey: '%mailjet.apikey%'
            $apisecret: '%mailjet.apisecret%'

    App\Client\RabbitClient:        
        arguments: ['%rabbitmq.host%','%rabbitmq.port%','%rabbitmq.user%','%rabbitmq.pwd%']                                

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM