使用DependencyInjection时如何在symfony中按名称注入服务

使用DependencyInjection时如何在symfony中按名称注入服务,symfony,symfony4,Symfony,Symfony4,我有一个在services.yaml中定义的具有不同参数的服务: user_uploader: class: App\Services\UploaderPath arguments: $basePath: "%users_directory%" worker_uploader: class: App\Services\UploaderPath arguments: $basePath: "%workers_directory%"

我有一个在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时,问题就出现了


在这种情况下如何注入适当的服务?

如果您使用的是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;
    }
}

这里有更多细节

我看不出问题所在。您只需定义foo服务并注入所需的依赖项。如果您想使用自动连接,那么您将为您的服务使用类名。在这种情况下,创建一个从UploaderPath扩展而来的WorkerUploaderPath就足够简单了。您也可能希望使用autowire的功能。我认为@Cerad没有注意到您正在尝试注入函数。这在扩展AbstractController的控制器中是可能的,但在一般服务中是不可能的。在这种情况下,您需要将$workerUploader注入类构造函数中,将其设置为类属性,然后像$this->workerUploader->doFoo@craigh我想了想,但只是在发表了我最初的评论之后。有可能foo实际上是一个控制器操作方法。我希望从海报上得到一些反馈,因为我不清楚他们到底想做什么。@craigh,但我必须在services.yaml中注册控制器,并将其作为参数传递,例如:@worker\u uploader?
class SomeController extends AbstractController
{
    private $userUploader;
    private $workerUploader;

    public function __construct($userUploader, $workerUploader)
    {
        $this->userUploader = $userUploader;
        $this->workerUploader = $workerUploader;
    }
}