mcm*_*phy 6 php constructor dependency-injection symfony
所以我有一个 Symfony 控制器,我通过参数将所需的服务注入到我的方法中。
MySqlGroupDAO $groupDAO此控制器类的所有方法都使用参数 ( ) 之一。
目前,我将“通用”参数作为每个方法中的最后一个参数传递,如下所示:
/**
* @Route("/{id}", methods={"POST"})
* @IsGranted("EDIT_GROUP", subject="parentGroup")
*/
public function addGroup(Request $request, MySqlGroupDAO $groupDAO) {
$group = new Group();
//code to init group from request
$groupDAO->addGroup($group);
return new Response("Adding $groupName");
}
Run Code Online (Sandbox Code Playgroud)
这样做可以让我消除我的__construct方法。但是,我不确定这是最好的方法。由于它在所有方法中都很常见,因此最好重新添加我的构造函数并执行以下操作吗?:
private $groupDAO;
public function __construct(
Config $config,
ValidatorInterface $validator,
TranslatorInterface $translator,
RequestStack $requestStack
) {
parent::__construct($config, $validator, $translator, $requestStack);
$this->groupDAO = new MySqlGroupDAO($config);
}
/**
* @Route("/{id}", methods={"POST"})
* @IsGranted("EDIT_GROUP", subject="parentGroup")
*/
public function addGroup(Request $request) {
$group = new Group();
//code to init group from request
$this->groupDAO->addGroup($group);
return new Response("Adding $groupName");
}
Run Code Online (Sandbox Code Playgroud)
在这样做的过程中,我消除了所有方法中的大约六个参数(在这个特定的类中)。但是我在我的构造函数中重新添加,这需要我添加一个类参数,并在我的构造函数中注入几个额外的参数,因为它扩展了另一个类。
以一种方式与另一种方式相比有优势吗?
谢谢。
在控制器的路由方法中使用 DI 的原因:
parent::__construct方法变化的影响。在构造函数上使用 DI 意味着您必须在发生变化时调整代码。还要注意,一些 Symfony 捆绑包可能会假设控制器具有特定的签名,如果没有,它可能会使事情变得更加复杂。在构造函数中使用 DI 的原因:
在构造函数中使用 DI 的替代方法:
您还可以使用setter 注入并以这种方式配置您的服务。这在功能上与在构造函数中使用 DI 非常相似,但它绕过了从父构造生成不同签名的主要缺点,并且在父构造函数更改时需要更多的维护工作。
您还可以使其更易于用于您经常注入的服务。使需要此 DI 的服务实现一个接口并使用_instanceof对其进行配置。Symfony 用它来做到这一点,ContainerAwareInterface甚至还有一个ContainerAwareTrait以声明 setter 和属性的形式的促进器。在您的情况下,如果多个服务需要该MySqlGroupDAO服务,您可以定义一个MySqlGroupDAOAwareTraitand MySqlGroupDAOAwareInterface,MySqlGroupDAOAwareInterface在您services.yaml的_instanceof部分添加一个条目,并使用该特征并在需要 DI 的服务中实现该接口。
| 归档时间: |
|
| 查看次数: |
1897 次 |
| 最近记录: |