Php Symfony 5中参数注入的自动接线问题
我在尝试从Symfony 5中的控制器检索管理器时遇到问题 我在Php Symfony 5中参数注入的自动接线问题,php,symfony,symfony4,Php,Symfony,Symfony4,我在尝试从Symfony 5中的控制器检索管理器时遇到问题 我在src/Manager/MailerManager.php中找到了这个MailerManager: <?php namespace App\Manager; use App\Client\MailjetClient; class MailerManager { private $mailjetClient; function __construct(MailjetClient $mailjetC
src/Manager/MailerManager.php中找到了这个MailerManager:
<?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;
}
}
这只是通过composer安装的mailjet sdk的包装,根据环境的不同,需要为其提供不同的$apikey
和$apisecret
,以便我通过services.yaml
文件使用参数,其中,我还为MailjetClient
和MailerManager
启用了自动连接和服务定义:
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'
我遇到的问题是,我遇到了以下错误:无法自动连线服务“App\Client\MailjetClient”:方法“\uu construct()”的参数“$apikey”的类型提示为“string”,您应该明确地配置它的值。
当我尝试在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();
}
}
}
我在services.yml
方面遭遇了一场彻底的灾难,多亏了u_mulder和Tejas Gosai的暗示,我终于可以将这一切付诸实施了。我在注入的参数上有一些类型错误,不需要MailManager.php
特定声明,我的客户机名称空间不应该以\
ad u\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%']
为什么您的服务定义以\`,例如
App\Manager\MailerManager\`结尾?因为App \:resource:“../src/*”exclude:“../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}”加载除excludes之外的所有目录。您需要排除此列表中的MailJet服务。您必须绑定参数,以避免像此处那样手动声明服务。退房
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%']