Symfony 4 中的外部服务配置
External service configuration in Symfony 4
我正在尝试使用 services.yaml 中的导入将一些服务定义移动到单独的文件中。 Here you can find this in symfony doc.
但是当我尝试执行此操作时出现错误:
Cannot autowire service "App\Domain\Test\Test": argument "$param" of method "__construct()" must have a type-hint or be given a value explicitly.
这是我的配置文件:
# 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,这会很好地工作。
有人知道我做错了什么吗?
问题是您的第一个文件尝试将您的服务加载为服务,但无法自动填充参数 string $param
。
一个好的解决方法可能是排除您的服务:
services:
App\:
resource: '../src/*'
exclude: '../src/{Entity,Migrations,Tests,Kernel.php,Domain/Test.php}'
另一个解决方案是简单地将这个定义放在 services.yaml
文件中。
您也可以考虑加载 App\Something\:
而不是完整的命名空间,但是如果您尝试在 cross-namespaces 定义中自动装配,这会有缺点。 (某些功能可能无法按预期工作)
我正在尝试使用 services.yaml 中的导入将一些服务定义移动到单独的文件中。 Here you can find this in symfony doc.
但是当我尝试执行此操作时出现错误:
Cannot autowire service "App\Domain\Test\Test": argument "$param" of method "__construct()" must have a type-hint or be given a value explicitly.
这是我的配置文件:
# 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,这会很好地工作。 有人知道我做错了什么吗?
问题是您的第一个文件尝试将您的服务加载为服务,但无法自动填充参数 string $param
。
一个好的解决方法可能是排除您的服务:
services:
App\:
resource: '../src/*'
exclude: '../src/{Entity,Migrations,Tests,Kernel.php,Domain/Test.php}'
另一个解决方案是简单地将这个定义放在 services.yaml
文件中。
您也可以考虑加载 App\Something\:
而不是完整的命名空间,但是如果您尝试在 cross-namespaces 定义中自动装配,这会有缺点。 (某些功能可能无法按预期工作)