使用 DependencyInjection 时如何在 symfony 中按名称注入服务
How to inject service by name in symfony when using DependencyInjection
我在 services.yaml 中定义了一项具有不同参数的服务:
user_uploader:
class: App\Services\UploaderPath
arguments:
$basePath: "%users_directory%"
worker_uploader:
class: App\Services\UploaderPath
arguments:
$basePath: "%workers_directory%"
当我将该服务注入另一个服务时,一切都很好,因为我可以通过名称注入它。
当我想使用 DI 并使用例如 worker_uploader
时会出现问题
public function foo(UploaderPath $workerUploader) {
}
在这种情况下如何注入正确的服务?
如果您使用的是 Symfony 3.4 或更高版本,您可以利用 bind 来做到这一点。
服务中的 yaml
services:
_defaults:
bind:
$userUploader: '@user_uploader'
$workerUploader: '@worker_uploader'
user_uploader:
class: App\Services\UploaderPath
arguments:
$basePath: "%users_directory%"
worker_uploader:
class: App\Services\UploaderPath
arguments:
$basePath: "%workers_directory%"
那么假设在 SomeController 中你可以像这样使用它:
class SomeController extends AbstractController
{
private $userUploader;
private $workerUploader;
public function __construct($userUploader, $workerUploader)
{
$this->userUploader = $userUploader;
$this->workerUploader = $workerUploader;
}
}
此处有更多详细信息https://symfony.com/doc/4.4/service_container.html#binding-arguments-by-name-or-type
我在 services.yaml 中定义了一项具有不同参数的服务:
user_uploader:
class: App\Services\UploaderPath
arguments:
$basePath: "%users_directory%"
worker_uploader:
class: App\Services\UploaderPath
arguments:
$basePath: "%workers_directory%"
当我将该服务注入另一个服务时,一切都很好,因为我可以通过名称注入它。
当我想使用 DI 并使用例如 worker_uploader
public function foo(UploaderPath $workerUploader) {
}
在这种情况下如何注入正确的服务?
如果您使用的是 Symfony 3.4 或更高版本,您可以利用 bind 来做到这一点。
服务中的 yaml
services:
_defaults:
bind:
$userUploader: '@user_uploader'
$workerUploader: '@worker_uploader'
user_uploader:
class: App\Services\UploaderPath
arguments:
$basePath: "%users_directory%"
worker_uploader:
class: App\Services\UploaderPath
arguments:
$basePath: "%workers_directory%"
那么假设在 SomeController 中你可以像这样使用它:
class SomeController extends AbstractController
{
private $userUploader;
private $workerUploader;
public function __construct($userUploader, $workerUploader)
{
$this->userUploader = $userUploader;
$this->workerUploader = $workerUploader;
}
}
此处有更多详细信息https://symfony.com/doc/4.4/service_container.html#binding-arguments-by-name-or-type