[英]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
:
我正在考虑做这样的事情:
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.