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

Php 处理多参数的依赖注入Symfony,php,dependency-injection,symfony5,Php,Dependency Injection,Symfony5,我实际上正在尝试自动连接一个类,其目的是构建查询。 类构造函数如下所示: #App\Services\RepositoryDirector class RepositoryDirector { public function __construct(BuilderQueryRepositoryInterface $builderQueryRepository, FilterInterface $filter) { $this->_builderQueryR

我实际上正在尝试自动连接一个类,其目的是构建查询。 类构造函数如下所示:

#App\Services\RepositoryDirector
class RepositoryDirector
{

    public function __construct(BuilderQueryRepositoryInterface $builderQueryRepository, FilterInterface $filter)
    {
        $this->_builderQueryRepository = $builderQueryRepository;
        $this->_filter = $filter;
    }
}
    #
    # 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'
请注意,这两个参数都是接口,因此它可能会根据我实现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
但问题是我这里不使用自动布线,这是强耦合的,因为我不使用DI

我想要的是这样的东西:

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

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

    // Controller logic
App\Controller\ProductController:
    public: true
    arguments:
        $productRepositoryDirector: ['@App\Repository\ProductRepository', '@App\Services\ProductFilter']
因此,我必须配置
config/services.yaml
来告诉Symfony,当我使用
$productRepositoryDirector
作为参数时,我希望它使用两个参数创建一个新对象
RepositoryDirector

  • ProductRepository$ProductRepository
  • ProductFilter$ProductFilter
  • 我在考虑这样做:

    # App\Controller\ProductController 
    class ProductController extends AbstractController
    {
        private RepositoryDirector $_productRepositoryDirector;
    
        public function __construct(RepositoryDirector $productRepositoryDirector)
        {
            $this->_productRepositoryDirector = $productRepositoryDirector;
        }
    
        // Controller logic
    
    App\Controller\ProductController:
        public: true
        arguments:
            $productRepositoryDirector: ['@App\Repository\ProductRepository', '@App\Services\ProductFilter']
    
    但这不起作用,我得到以下错误:

    无法自动连线服务“App\Services\RepositoryDirector”:参数 方法“\uu 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\UserTokenRepository”, “App\Repository\ValueRepository”


    我一直在阅读,但它并没有为我的问题提供任何解决方案。

    我终于找到了解决方案

    您必须如下配置
    config/services.yaml

    #App\Services\RepositoryDirector
    class RepositoryDirector
    {
    
        public function __construct(BuilderQueryRepositoryInterface $builderQueryRepository, FilterInterface $filter)
        {
            $this->_builderQueryRepository = $builderQueryRepository;
            $this->_filter = $filter;
        }
    }
    
        #
        # 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'
    
    我错过了
    关键字,这是由于phpsform自动完成,我很幸运找到的

    如果你仔细阅读,你会注意到这个关键字与别名的用法完全一样,正如我在上面的代码中所做的那样


    现在我能够找到关于这个问题的更精确的文档:。

    我终于找到了解决方案

    您必须如下配置
    config/services.yaml

    #App\Services\RepositoryDirector
    class RepositoryDirector
    {
    
        public function __construct(BuilderQueryRepositoryInterface $builderQueryRepository, FilterInterface $filter)
        {
            $this->_builderQueryRepository = $builderQueryRepository;
            $this->_filter = $filter;
        }
    }
    
        #
        # 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'
    
    我错过了
    关键字,这是由于phpsform自动完成,我很幸运找到的

    如果你仔细阅读,你会注意到这个关键字与别名的用法完全一样,正如我在上面的代码中所做的那样

    现在,我已经能够找到有关此问题的更精确的文档: