首页 文章

Symfony结合了yaml和php配置文件

提问于
浏览
1

在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 回答

  • 2

    问题是您在 src/* 中注册了两次,一次在 services.php 中,一次在 services.yaml 中 .

    因此,在第一次使用 services.php 运行时,您正确地定义了类和所需的参数,然后,在第二次运行中使用 services.yaml 时,定义被覆盖并且它再次丢失参数 .

    最小的解决方案是排除 services.yaml 中的 SomeClass.php ,这样它就不会再次注册:

    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests,Kernel.php,SomeClass.php}' # <- here I added SomeClass.php
    

    尽管创建一个单独的命名空间并排除YAML中的目录并且只在PHP-config中注册该目录会更好 .

相关问题