MVC接线;查看和模型

时间:2012-04-14 04:06:25

标签: php model-view-controller

根据这个答案,从视图中调用模型似乎没问题。

Can I call a Model from a View?

现在我的问题是,布线怎么样?

控制器会将模型工厂传递给视图吗? (我认为这会破坏这个问题的目的,因为除非我理解错误,否则必须绕过控制器才能做到这一点)

或者

在视图传递给控制器​​之前,View是否会在View的构造函数中注入模型工厂?

1 个答案:

答案 0 :(得分:2)

乍一看,我没有看到问题。让我们来看看替代方案:

  1. 将原始模型传递到视图中,键入提示关闭通用模型接口

    从表面上看,这似乎没问题。但是,如果您的模型在其api中不一致(例如$model->getPerson($id),这很可能),这实际上是将控制器模型和视图紧密耦合在一起。

    由于您的视图无法真正接受任何模型,因此从控制器注入原始模型可能有点过于宽松,并且在未来发生不一致或奇怪错误的大门。

  2. 将原始模型传递到视图中,键入提示所需的模型类

    这解决了先前解决方案中的自由度问题,因为只有正确的模型才能通过。但是现在你进一步将视图与该模型结合起来了。所以这不好。

  3. 在视图中实例化模型。

    这也不是一个理想的解决方案,因为现在您无法模拟您的模型进行测试,并将视图完全耦合到模型中。明确的SOLID违规行为。

  4. 所以基本上就是注入了模型的工厂。它允许视图确定它需要哪个模型(因此从工厂请求)。它允许模拟模型(通过交换不同的工厂)。它还允许通过调整工厂返回的内容来传递任意模型。

    因此依赖关系现在松散耦合,而你依赖于工厂(这是一个更好的依赖)。

    这是我的第一个念头。我需要进一步思考,看看是否有一个更清洁的解决方案,但你有它......