使用 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