【问题标题】:Dependency injection in MVCMVC 中的依赖注入
【发布时间】:2011-01-20 10:34:39
【问题描述】:

我正在尝试创建简单的 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

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

一些例子:

  • 控制器可能需要 Config 来获取输出格式选项。
  • Mapper 可能需要数据库来执行查询。
  • 任何控制器/助手都需要访问日志。
  • Helper 可能需要任意数量的依赖项(例如:Uri_Helper 需要路由器)。

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

【问题讨论】:

    标签: php model-view-controller dependency-injection


    【解决方案1】:

    你写factories(优秀文章)。这可能很无聊(就像文章提到的那样),因此您可以使用 DI 框架,例如:

    • Symfony DIC:参见 Juraj 的帖子。
    • PD
    • Yadif
    • Drip(PHP4): 好久没更新了。

    我还想指出,Misko 的博客非常有趣,并且有很多关于如何正确进行测试的好读物。尤其是guide to writing testable code 是必读的。

    P.S:我认为您应该编写工厂,因为 PHP 是一种脚本语言,您应该使用尽可能少的代码来使您的网站快速运行。这就是某些PHP frameworks 的问题。

    Rasmus Ledorf(PHP 发明者)的名言:

    许多框架可能看起来很 乍一看很吸引人,因为它们 似乎减少了网络应用程序 发展到一些琐碎的事情 导致一些代码生成的步骤 并且通常是自动模式检测, 但这些相同的捷径很可能 也是你的瓶颈,因为他们 通过牺牲来实现这种简单性 灵活性和性能。没有什么 将构建您的应用程序 你,不管它承诺什么。你 将不得不建造它 你自己。而不是从 修正一些国外的错误 框架和重构所有 不适用于您的事情 环境 花时间建立一个 适合的精益和可重复使用的模式 直接你的要求。到底 我想你会发现你的 国产小框架拯救了 你的时间和恶化,你结束 推出更好的产品。

    【讨论】:

      【解决方案2】:

      您可以使用像 Symfony DIC 这样的依赖注入容器。您在容器内定义对象、配置和布线,然后由它负责实例化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多