我正在用 PHP 构建一个简单的 MVC 框架,但我被困在我必须创建一个BaseController
类的部分。
每个“页面”控制器都需要从 this 扩展BaseController
。因为这个 BaseController 类将具有允许用户访问template
引擎和Logger
类(以及其他一些东西)的属性。
我遇到的问题是我不确定如何在 BaseController 类中实例化这些东西。我显然可以__constructo()
像这样对其进行硬编码:
class BaseController
{
protected $view;
protected $log;
public function __construct()
{
$this->view = new \namespace\view('param1', 'param2');
$this->log = new Logger('name');
$this->log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
}
}
但这并不能使它非常模块化。例如,很难更改 Logger 类。或者如果用户想将模板引擎更改为 Smarty。
我也不能真正使用依赖注入的形式。因为从 扩展的每个控制器BaseController
都必须将这些实例传递给BaseController
.
看起来像这样:
class BaseController
{
protected $view;
protected $log;
public function __construct($view, $log)
{
$this->view = $view;
$this->log = $log;
}
}
家庭控制器
class HomeController extends BaseController
{
public function __construct($view, $log)
{
parent::__construct($view, $log);
// Do my own stuff
}
}
对我来说,当用户只想在__constructor
. 甚至没有IoC
。
所以我现在唯一能想到的Service Provider
就是__construct
在BaseController
. 但我不确定这是否是要走的路?也许有更好的选择?
那么解决这个问题的好方法是什么?
PS。如果我确实需要 a Service Locator
,那里有什么好的例子吗?我发现的那些是由似乎他们并不真正知道他们在说什么的人写的。他们基本上是在抄袭彼此的博文。