在Symfony 4中,我想为服务组合不同的配置文件 . 在以下场景中,我尝试从名为services.php的php配置导入服务,然后在导入其他服务的yaml文件中执行其他服务配置 .
services.yaml
imports:
- { resource: services.php }
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\:
resource: '../src/*'
exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
services.php
<?php
use Symfony\Component\DependencyInjection\Definition;
$definition = new Definition();
$definition
->setAutowired(true)
->setAutoconfigured(true)
->setPublic(false)
;
$this->registerClasses($definition, 'App\\', '../src/*', '../src/{Entity,Migrations,Tests}');
$container->getDefinition(\App\SomeClass::class)
->setArgument('$param', 'someValue');
类文件
class SomeClass
{
public function __construct(string $param)
{
...
}
我收到以下错误:
无法自动装配服务“App \ SomeClass”:方法“__construct()”的参数“$ param”是类型提示“字符串”,您应该明确配置其值 .
另外,我想知道是否有必要覆盖yaml中的初始_defaults定义(或已经由导入的文件完成的其他定义),或者我可以继承 . 不确定这些文件是如何合并的 .
1 回答
问题是您在
src/*
中注册了两次,一次在services.php
中,一次在services.yaml
中 .因此,在第一次使用
services.php
运行时,您正确地定义了类和所需的参数,然后,在第二次运行中使用services.yaml
时,定义被覆盖并且它再次丢失参数 .最小的解决方案是排除
services.yaml
中的SomeClass.php
,这样它就不会再次注册:尽管创建一个单独的命名空间并排除YAML中的目录并且只在PHP-config中注册该目录会更好 .