php - 无法自动装配服务...虽然服务参数已配置
问题描述
我在服务配置中自动装配一些参数时遇到问题。
我不能clear:cache
,因为它会触发错误,所以我认为这不是缓存问题。我已经将所有文件复制/粘贴到一个全新的 Symfony 项目中,但仍然遇到同样的问题。
这是我的 services.yaml
#config/services.yaml
parameters:
app.medipim_api_key_value: '%env(resolve:MEDIPIM_API_KEY)%'
app.medipim_api_key_id: 326
services:
[6 lines ...]
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/*'
exclude:
'../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
App\Services\MedipimApi:
arguments:
$medipim_api_key_id: '%app.medipim_api_key_id%'
$medipim_api_key_value: '%app.medipim_api_key_value%'
[10 lines ...]
这是我的服务:
#src/Services/MedipimApi.php
class MedipimApi
{
const FILTER_CNK_AND_ACTIVE = 'filter_cnk_and_active';
/**
* @var MedipimApiV3Client
*/
private MedipimApiV3Client $medipimApiV3Client;
private TranslatorInterface $translator;
/**
* MedipimApi constructor.
* @param string $medipim_api_key_id API key id for Medipim API call
* @param string $medipim_api_key_value Api key (secret) value for Medipim API call
* @param TranslatorInterface $translator TranslatorInterface object for I18N purpose
*/
public function __construct(string $medipim_api_key_id, string $medipim_api_key_value, TranslatorInterface $translator)
{
$this->translator = $translator;
$this->medipimApiV3Client = new MedipimApiV3Client($medipim_api_key_id, $medipim_api_key_value);
}
....
当我尝试调用此服务时,出现此错误:
无法自动装配服务“App\Services\MedipimApi”:方法“__construct()”的参数“$medipim_api_key_id”是类型提示的“字符串”,您应该明确配置其值。
只有当我复制 的值services.yaml
并将其粘贴到我的services_env.yaml
(其中 env 是我当前的环境)时,它才有效。
#config/services_dev.yaml
parameters:
app.medipim_api_key_value: '%env(resolve:MEDIPIM_API_KEY)%'
app.medipim_api_key_id: 326
services:
[6 lines ...]
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
App\Services\MedipimApi:
arguments:
$medipim_api_key_id: '%app.medipim_api_key_id%'
$medipim_api_key_value: '%app.medipim_api_key_value%'
[10 lines ...]
现在它起作用了!
为什么这行得通?
Symfony 假设按此处所述加载文件:
对于开发环境,Symfony 会按以下顺序加载以下配置文件和目录:
- 配置/包/*
- 配置/包/开发/*
- 配置/服务.yaml
- 配置/services_dev.yaml
我错过了什么?
编辑
我的内核类看起来不错。它正在加载 services.yaml,然后是 services_env.yaml:
class Kernel extends BaseKernel
{
[1 line...]
protected function configureContainer(ContainerConfigurator $container): void
{
$container->import('../config/{packages}/*.yaml');
$container->import('../config/{packages}/'.$this->environment.'/*.yaml');
if (is_file(\dirname(__DIR__).'/config/services.yaml')) {
$container->import('../config/{services}.yaml');
$container->import('../config/{services}_'.$this->environment.'.yaml');
} elseif (is_file($path = \dirname(__DIR__).'/config/services.php')) {
(require $path)($container->withPath($path), $this);
}
}
[14 lines...]
解决方案
为什么在 yml 文件中将参数 xx_id 配置为 int ?在您的服务中,您输入提示的 id 作为字符串!
推荐阅读
- laravel - 如何使用电子邮件而不是 id 更新 laravel rest api 中的数据
- perl - perl 将数字替换为字母,用于 for
- magento - Magento 2 未完全保护错误且管理员无法正常工作
- mysql - MySQL中的条件连接查询
- text - 如何在颤动中从“相机”或“画廊”捕获的“图像”上添加文本?
- javascript - React - 如果更新 div/span 的值,如何触发动画?
- php - 在我按下刷新符号之前,我的购物车 Div 不会刷新
- java - Lambda 合并内部对象列表
- angular - 在角度 8 的一个请求中发送图像和 json 数据时出错
- django - 当新用户在 Django 应用程序中注册时向管理员发送电子邮件