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