在symfony中使用DependencyInjection时,如何通过名称注入服务?

问题描述 投票:0回答:1

我有一个服务,在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 symfony4
1个回答
1
投票

如果你使用的是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.comdoc4.4service_container.html#binding-arguments by name-or-type。

© www.soinside.com 2019 - 2024. All rights reserved.