繁体   English   中英

处理多个参数的依赖注入 Symfony

[英]Dependecy Injection Symfony dealing with multiple parameter

我实际上是在尝试自动装配一个旨在构建查询的类。 类构造函数如下所示:

#App\Services\RepositoryDirector
class RepositoryDirector
{

    public function __construct(BuilderQueryRepositoryInterface $builderQueryRepository, FilterInterface $filter)
    {
        $this->_builderQueryRepository = $builderQueryRepository;
        $this->_filter = $filter;
    }
}

请注意,这两个参数都是接口,因此它可能会根据我实现 RepositoryDirector 的位置而改变。

我尝试在名为 ProductController 和 CartController 的两个控制器中实现这个对象。

# App\Controller\ProductController 
class ProductController extends AbstractController
{
    private RepositoryDirector $_cartRepositoryDirector;

    public function __construct(ProductRepository $productRepository, ProductFilter $productFilter)
    {
        $this->_productRepositoryDirector = new RepositoryDirector($productRepository, $productFilter);
    }

    // Controller logic
# App\Controller\CartController 
class CartController extends AbstractController
{
    private RepositoryDirector $_cartRepositoryDirector;

    public function __construct(CartRepository $cartRepository, CartFilter $cartFilter)
    {
        $this->_cartRepositoryDirector = new RepositoryDirector($cartRepository, $cartFilter);
    }

    // Controller logic

但问题是我在这里不使用自动布线,而且这是强耦合的,因为我不使用 DI。

我想要的是这样的:

# App\Controller\ProductController 
class ProductController extends AbstractController
{
    private RepositoryDirector $_productRepositoryDirector;

    public function __construct(RepositoryDirector $productRepositoryDirector)
    {
        $this->_productRepositoryDirector = $productRepositoryDirector;
    }

    // Controller logic

所以我必须配置config/services.yaml来告诉 Symfony 当我使用$productRepositoryDirector作为参数时,我希望它创建一个带有两个参数的新对象RepositoryDirector

  1. ProductRepository $productRepository
  2. 产品过滤器 $productFilter

我正在考虑做这样的事情:

App\Controller\ProductController:
    public: true
    arguments:
        $productRepositoryDirector: ['@App\Repository\ProductRepository', '@App\Services\ProductFilter']

但这不起作用,我收到以下错误:

无法自动装配服务“App\\Services\\RepositoryDirector”:方法“__construct()”的参数“$builderQueryRepository”引用接口“App\\Repository\\BuilderQueryRepositoryInterface”,但不存在这样的服务。 您可能应该将此接口别名为这些现有服务之一:“App\\Repository\\AreaCodeRepository”、“App\\Repository\\CompanyRepository”、“App\\Repository\\DataRepository”、“App\\Repository\\GroupRepository”、“App\\Repository” ParamStyleRepository", "App\\Repository\\ParamTypeDatasetRepository", "App\\Repository\\ParamTypeFormatRepository", "App\\Repository\\ParamTypeRepository", "App\\Repository\\ParameterGroupRepository", "App\\Repository\\ParameterRepository", "App\\Repository\\PhoneNumberRepository" , "App\\Repository\\ProductRepository", "App\\Repository\\UserTokenRepository", "App\\Repository\\ValueRepository"。

我一直在阅读此文档,但它没有提供有关我的问题的任何解决方案。

我终于找到了解决方案。

您必须像这样配置config/services.yaml

    #
    # Director repository services
    #
    app.services.repository_director.product:
        public: true
        class: App\Services\RepositoryDirector
        arguments:
            $builderQueryRepository: '@App\Repository\ProductRepository'
            $filter: '@App\Services\Filters\ProductFilter'

    app.services.repository_director.cart:
        public: true
        class: App\Services\RepositoryDirector
        arguments:
            $builderQueryRepository: '@App\Repository\CartRepository'
            $filter: '@App\Services\Filters\CartFilter'

    #
    # Controller
    #
    App\Controller\ProductController:
        public: true
        arguments:
            $productRepositoryDirector: '@app.services.repository_director.product'

    App\Controller\CartController:
        public: true
        arguments:
            $cartRepositoryDirector: '@app.services.repository_director.cart'

由于 PHPStorm 自动完成,我错过了class关键字,我纯粹是靠运气找到的!

如果您非常仔细地阅读此文档,您会注意到此关键字与别名的用法完全一样,就像我在上面的代码中所做的那样。

现在我已经能够找到关于这个问题的更精确的文档: 显式配置服务和参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM