我有目前的情况:
A有一个抽象类Controller
,它具有依赖项,这些依赖项在运行时由服务定位器Locator
注入。服务定位器得到了正确的实现——它不是在整个应用程序中传递的,只由作为应用程序根对象的Controller
使用。
我遇到的问题是,当我从Controller
继承时,如何构建服务定位器——我不一定希望(也不希望)扩展基本服务定位器Locator
,但我需要复制父类的依赖项。
下面是一些示例代码来解释发生了什么:
// Controller.php
namespace abstract;
abstract class Controller {
public function __construct( $locator ) {
$this->template_handler = $locator->getTemplateHandler();
$this->input_sanitizer = $locator->getInputSanitizer();
}
}
-
// Controller.php
class Controller extends abstract'Controller {
public function __construct( $locator ) {
$this->data_factory = $locator->getDataFactory();
parent::__construct( $locator );
}
}
-
// Locator.php
namespace abstract;
class Locator {
public function getTemplateHandler() {
return 1234;
}
public function getInputSanitizer() {
return 1234;
}
}
所以我想问题变成了——如何定义我的Locator
类?我是扩展abstract'Locator
(创建一个并行继承树),还是在不扩展abstract'Locator
的情况下实现相同的方法(这是重复的代码),还是做了一些我没有想到的不同的事情?
您应该在所有控制器中使用一个定位器。当然,除非服务非常具体。否则,如果您必须首先定位所需的定位器,那么服务定位器的用途是什么?