Symfony 4 依赖注入 - 根据用例定义构造函数参数
Symfony 4 dependecy injection - Define constructor arguments depending on use case
我有一个使用配置进行处理的通用服务。
<?php
namespace App\Service;
class MyCustomService
{
/**
* @var array
*/
private $config;
/**
* MyCustomService constructor.
*
* @param array $config
*/
public function __construct(array $config)
{
$this->config = $config;
}
public function getConfig()
{
return $this->config;
}
}
我想在控制器的操作中注入该服务。但是每个动作都有特定的配置。
<?php
namespace App\Controller;
use App\Service\MyCustomService;
class MyCustomController
{
public function action_1(MyCustomService $myCustomService)
{
/**
* $config must contain
* ['foo' => 'bar']
*/
$config = $myCustomService->getConfig();
}
public function action_2(MyCustomService $myCustomService)
{
/**
* $config must contain
* ['foo' => 'baz']
*/
$config = $myCustomService->getConfig();
}
}
我如何使用 config/services. Yaml
做到这一点?
有没有办法配置控制器动作?
像这样,例如:
services:
#...
#...
#...
App\Controller\MyCustomController:action_1:
arguments:
$myCustomService:
App\Service\MyCustomService:
arguments:
$config: {foo: 'bar'}
App\Controller\MyCustomController:action_2:
arguments:
$myCustomService:
App\Service\MyCustomService:
arguments:
$config: {foo: 'baz'}
我可以在 MyCustomService 中使用配置方法,并在每个控制器的操作中调用它。但是没那么优雅。
您可以通过类似
的方式定义不同的实例(例如:具有不同的配置)
services:
App\Service\MyCustomService $s1:
config:
- foo: 'bar'
并注入控制器动作,如
public function action_1(MyCustomService $s1)
参数按名称匹配,每次您使用该签名定义参数(class 名称 + 参数名称)Symfony 将注入正确的实例。
您还应该设置 autowire
和 register controllers as services
我有一个使用配置进行处理的通用服务。
<?php
namespace App\Service;
class MyCustomService
{
/**
* @var array
*/
private $config;
/**
* MyCustomService constructor.
*
* @param array $config
*/
public function __construct(array $config)
{
$this->config = $config;
}
public function getConfig()
{
return $this->config;
}
}
我想在控制器的操作中注入该服务。但是每个动作都有特定的配置。
<?php
namespace App\Controller;
use App\Service\MyCustomService;
class MyCustomController
{
public function action_1(MyCustomService $myCustomService)
{
/**
* $config must contain
* ['foo' => 'bar']
*/
$config = $myCustomService->getConfig();
}
public function action_2(MyCustomService $myCustomService)
{
/**
* $config must contain
* ['foo' => 'baz']
*/
$config = $myCustomService->getConfig();
}
}
我如何使用 config/services. Yaml
做到这一点?
有没有办法配置控制器动作?
像这样,例如:
services:
#...
#...
#...
App\Controller\MyCustomController:action_1:
arguments:
$myCustomService:
App\Service\MyCustomService:
arguments:
$config: {foo: 'bar'}
App\Controller\MyCustomController:action_2:
arguments:
$myCustomService:
App\Service\MyCustomService:
arguments:
$config: {foo: 'baz'}
我可以在 MyCustomService 中使用配置方法,并在每个控制器的操作中调用它。但是没那么优雅。
您可以通过类似
的方式定义不同的实例(例如:具有不同的配置)services:
App\Service\MyCustomService $s1:
config:
- foo: 'bar'
并注入控制器动作,如
public function action_1(MyCustomService $s1)
参数按名称匹配,每次您使用该签名定义参数(class 名称 + 参数名称)Symfony 将注入正确的实例。
您还应该设置 autowire
和 register controllers as services