Symfony DependencyInjection:导入多个资源(yaml)



我正在尝试实现Symfony依赖注入组件(https://symfony.com/doc/current/components/dependency_injection.html)在一个非Symfony项目.

如果我把所有的服务和参数放到一个单独的"services.yaml"文件。例:

# services.yaml
parameters:
mysql.host: "127.0.0.1"
mysql.database: "database"
mysql.username: "root"
mysql.password: ""
oracle.database: ""
oracle.username: ""
oracle.password: ""
cookie.domain: ".site.local"
cookie.lifetime: 0
cookie.useHttps: true
services:
_defaults:
autowire: true
autoconfigure: true
App:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
OtherNamespace:
resource: '../someHomemadeLibrary/src/*'

OtherNamespaceDatabaseDriversMySqlDriver:
class: OtherNamespaceDatabaseDriversMySqlDriver
arguments:
$host: "%mysql.host%"
$database: "%mysql.database%"
$username: "%mysql.username%"
$password: "%mysql.password%"
# ...    

由于文件越来越大,我想把它分成不同的文件,如下所示:https://symfony.com/doc/current/service_container/import.html#importing-configuration-with-imports

所以我试了:

# index.php
$containerBuilder = new ContainerBuilder();
$loader = new YamlFileLoader($containerBuilder, new FileLocator('config/'));
$loader->load('services.yaml');
# services.yaml
imports:
- { resource: "databases.yaml" }
- { resource: "sessions.yaml" }
services:
_defaults:
autowire: true
autoconfigure: true
App:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

OtherNamespace:
resource: '../someHomemadeLibrary/src/*'
# databases.yaml
parameters:
mysql.host: "127.0.0.1"
mysql.database: "database"
mysql.username: "root"
mysql.password: ""
services:
OtherNamespaceDatabaseDriversMySqlDriver:
class: OtherNamespaceDatabaseDriversMySqlDriver
arguments:
$host: "%mysql.host%"
$database: "%mysql.database%"
$username: "%mysql.username%"
$password: "%mysql.password%"
# ...  

但是在这个配置中,我得到以下错误:

致命错误:UncaughtSymfony 组件 DependencyInjection RuntimeException异常:无法自动连接服务"OtherNamespaceDatabaseDriversMySqlDriver"参数"host&quot美元;方法__construct()"是类型暗示"字符串",你呢应该显式配置它的值。

如果我切换导入顺序,则是CookieSession有问题。这就像导入重写了参数和服务,只使用最后一个?如何将服务及其参数拆分到多个文件中?

谢谢你!

问题是我的服务被正确地从我的databases.yaml和其他yaml导入到我的services.yaml文件中,但是在这个文件中,我还自动将类转换为服务。

所以我定义的服务被重新加载/转换,但没有参数和所有。我添加了排除,它工作!

App:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

OtherNamespace:
resource: '../someHomemadeLibrary/src/*'
exclude: 
[
'.../theClassFileDeclaredInAnotherYaml.php',
'../or/a/whole/folder/not/to/be/loaded/again/*.php'
]

感谢@NicoHaase, @Cerad和@WillB。感谢他们的帮助!

最新更新