根据这个答案,从视图中调用模型似乎没问题。
Can I call a Model from a View?
现在我的问题是,布线怎么样?
控制器会将模型工厂传递给视图吗? (我认为这会破坏这个问题的目的,因为除非我理解错误,否则必须绕过控制器才能做到这一点)
或者
在视图传递给控制器之前,View是否会在View的构造函数中注入模型工厂?
答案 0 :(得分:2)
将原始模型传递到视图中,键入提示关闭通用模型接口
从表面上看,这似乎没问题。但是,如果您的模型在其api中不一致(例如$model->getPerson($id)
,这很可能),这实际上是将控制器模型和视图紧密耦合在一起。
由于您的视图无法真正接受任何模型,因此从控制器注入原始模型可能有点过于宽松,并且在未来发生不一致或奇怪错误的大门。
将原始模型传递到视图中,键入提示所需的模型类
这解决了先前解决方案中的自由度问题,因为只有正确的模型才能通过。但是现在你进一步将视图与该模型结合起来了。所以这不好。
在视图中实例化模型。
这也不是一个理想的解决方案,因为现在您无法模拟您的模型进行测试,并将视图完全耦合到模型中。明确的SOLID违规行为。
所以基本上就是注入了模型的工厂。它允许视图确定它需要哪个模型(因此从工厂请求)。它允许模拟模型(通过交换不同的工厂)。它还允许通过调整工厂返回的内容来传递任意模型。
因此依赖关系现在松散耦合,而你依赖于工厂(这是一个更好的依赖)。
这是我的第一个念头。我需要进一步思考,看看是否有一个更清洁的解决方案,但你有它......