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
:
# 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自动完成,我很幸运找到的
如果你仔细阅读,你会注意到这个关键字与别名的用法完全一样,正如我在上面的代码中所做的那样
现在,我已经能够找到有关此问题的更精确的文档: