Symfony 4中的外部服务配置

4
我正在尝试在services.yaml中使用导入功能,将一些服务定义移到单独的文件中。您可以在Symfony文档中找到此信息
但是当我尝试这样做时,我会遇到以下错误:

无法自动装配服务“App\Domain\Test\Test”:方法“__construct()”的参数“$param”必须具有类型提示或明确给出一个值。

以下是我的配置文件:
# services.yaml
imports:
    - { resource: services/test.yaml }

services:
    _defaults:
        autowire: true      
        autoconfigure: true 
        public: false       

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

    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

并且
# test.yaml
parameters:
    param: 'some param'

services:
    App\Domain\Test\Test:
        public: true
        autowire: true
        arguments:
            $param: '%param%'

以下是服务内容:

namespace App\Domain\Test;

class Test
{
    private $mailer;
    private $param;

    public function __construct(\Swift_Mailer $mailer, string $param)
    {
        $this->mailer = $mailer;
        $this->param = $param;
    }
}

如果我将参数和服务移动到services.yaml,这会很顺利运作。 有人知道我做错了什么吗?

_defaults 部分需要在所有的服务文件中重复。此外,在测试时,config/services_test.yaml 将自动加载。 - Cerad
1个回答

4
问题在于您的第一个文件试图将您的服务作为服务加载,无法自动填充参数string $param

一个好的解决方法可能是排除您的服务:

services:
    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests,Kernel.php,Domain/Test.php}'

另一种解决方案是将此定义直接放在services.yaml文件中。您也可以考虑加载App\Something\:而不是完整的命名空间,但是如果您尝试在跨命名空间的定义中自动装配,则会有缺点(某些功能可能无法正常工作)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接