MVC中的依赖注入

Hem*_*ulo 8 php model-view-controller dependency-injection

我正在尝试创建简单的MVC骨架,并且我坚持使用依赖项.

这就是我现在拥有的:

$config = new Config();
$database = new Database($config);
$uri = new Uri('article/5');
$request = new Request($uri);
$response = new Response;
$router = new Router;
$dispatcher = new Dispatcher($request, $response, $router);

$dispatcher->dispatch(); // Routing, instantiate controller, execute action, send response
Run Code Online (Sandbox Code Playgroud)

问题是:任何对象如何访问任何依赖项?

一些例子:

  • 控制器可能需要Config才能获得输出格式选项.
  • Mapper可能需要Database来执行查询.
  • 任何Controller/Helper都需要访问Log.
  • Helper可能需要任意数量的依赖项(例如:Uri_Helper需要Router).

我能想到的唯一可能是使用注册表,但这违反了得墨忒耳法则(询问你真正需要的是什么).

Alf*_*red 5

你写工厂(优秀的文章).这可能完全无聊(就像文章中提到的那样),所以你可以使用像以下那样的DI框架:

  • Symfony DIC:见Juraj的帖子.
  • PD
  • Yadif
  • Drip(PHP4):但暂时没有更新.

另外我想指出Misko的博客非常有趣,并且有很多关于如何正确进行测试的好读物.特别是编写可测试代码指南是必读的.

PS:我认为你应该写工厂,因为PHP是一种脚本语言,你应该使用尽可能少的代码来使你的网站快速.这是一些PHP框架的问题.

Rasmus Ledorf(PHP发明家)的引用:

许多框架乍一看可能看起来非常吸引人,因为它们似乎将Web应用程序开发减少到导致一些代码生成和自动模式检测的几个简单步骤,但这些相同的快捷方式可能也是您的瓶颈,因为它们实现了这一点通过牺牲灵活性和性能来简化.无论它承诺什么,没有什么能够为你构建你的应用程序.你将不得不自己构建它.而不是通过修复某些外部框架中的错误并重构所有不适用于您的环境的事情,而不是花时间构建一个直接符合您要求的精简和可重用模式.最后我想你会发现你自己开发的小框架为你节省了时间和精力,最终得到了更好的产品.