【发布时间】:2017-07-18 15:42:48
【问题描述】:
我什么时候使用new 在我的控制器中创建任何类,我什么时候注入该类到我的控制器中?
例如,假设我有一个AnnotationBuilder 类(它通过读取域实体内的注释来构建一个Zend\Form 对象)。
我可以像这样在我的控制器中调用它:
$form = (new AnnotationBuilder())->createForm(MyForm::class);
或者我可以将AnnotationBuilder 的实例传递给我的控制器并像这样调用它:
$form = $this->annotationBuilder->createForm(MyForm::class);
或者如果我将AnnotationBuilder直接传递给方法,我可以使用:
$form = $annotationBuilder->createForm(MyForm::class);
对此有什么指导方针吗?例如,阅读依赖注入时,我可以大胆猜测必须声明我的所有依赖项,并且由于AnnotationBuilder 是构建表单所需的部分,我可能可以将其注入到我的控制器的构造函数中。或者作为 setter 方法。
其他课程呢?目前在我现有的控制器中,我可以算出大约 6 个new 操作员。我是否盲目地将它们重构为全部传递到控制器中?
在控制器中使用new 创建东西是否可以接受?
【问题讨论】:
-
将实例传递给一个类可以让您更好地测试您的类,允许您创建无法直接测试的类的模拟。
-
我认为
new对于值对象是可以接受的。作为旁注,切勿盲目重构,除非您有 300% 的测试覆盖率。例如对象是通过引用传递的,如果您的容器在多次调用中重用同一个对象,您可能会遇到一些脏状态。
标签: php oop dependency-injection instantiation