【问题标题】:MVC, how view should be accessed from controller?MVC,如何从控制器访问视图?
【发布时间】:2010-03-08 20:04:19
【问题描述】:

我只是在学习 MVC,所以你可能会觉得我的问题很奇怪......

我的控制器可以通过传递给控制器​​构造函数的容器对象访问不同的共享对象。要访问共享对象,我应该 $this->container->db 访问数据库适配器或 $this->container->memcache 访问 Memcached 适配器。我想知道我应该将 View 对象放入具有共享对象的 Container 中还是不

从一方面来看,从这个容器中获取视图真的很舒服,但是这样我就不能创建多个视图实例(例如,每次我从视图中调用控制器的方法时,我应该再有一个视图实例) .解决办法是什么?我应该如何将 View 对象传递给 Controller 和/或我应该如何从 Controller 创建新的 View 实例?

谢谢!

【问题讨论】:

  • 那个容器是什么东西?
  • ...和数据库适配器?控制器应该使用模型,而不是 db 或其适配器......模型应该由它们自己或一些存储库委托从 db 获取
  • 为什么要从视图中调用控制器方法?是不是反对MVC之间的分离?
  • @Gregoire,是的,当我想重用其他控制器方法返回的一些 html 时,我正在从视图中调用控制器方法。可能,我应该使用某种 Helpers 来做到这一点,但我对 helpers 还不太了解 :)
  • @Gabriel Ščerbák,是的,这是一个非常糟糕的例子,对不起。忘记数据库适配器(或者当然我只在模型中使用它)。但我仍在使用 Config 对象(并且我也通过 Container 对象访问它)。这是真正的示例容器对象twittee.org

标签: model-view-controller


【解决方案1】:

如果您想要那种 DI 体验,也可以在视图上进行,但我不知道它是否真的对您有帮助。永远不要从视图中调用控制器方法。而是编写一些局部视图方法并从视图中调用它们,这些视图定义了页面布局(类似于 Rails 所做的)。 恕我直言,如果您想逐渐了解 MVC,请从核心原则开始并迭代了解细节,但不要将架构/设计模式作为 MVC 部分学习 - 架构、设计,整体很重要:)

【讨论】:

  • 如果我想在我的视图中使用 HTML 的一些缓存部分怎么办?我有三种方式——调用控制器方法、调用模型方法、调用缓存器方法。调用缓存器方法意味着将某种键传递给它,但是缓存器和视图都不知道键的任何内容(但模型和控制器知道)。调用模型方法意味着我们应该与模型中的视图对象进行交互(我真的不知道是好是坏)。
  • 说“缓存部分”是指部分 HTML 缓存。
【解决方案2】:

嗯,也许可以尝试为静态部分实现缓存。恕我直言,尝试将缓存器对象(通过 DI)插入控制器,并让该对象决定您是要发送缓存的局部视图还是实例化一个新的。如果要从 db 缓存数据,请使用从控制器到模型的相同模式,因此每当在控制器中需要模型时,请询问 db 缓存器对象(相同的 DI 原则)。够清楚吗?

【讨论】:

  • Gabriel Ščerbák,真的,很抱歉花了这么多时间。你的回答真的很好。
  • 没问题,但要专注于架构,而不是具体的实现,我不是专家,所以要注意其他实现,许多框架的做法不同,MVC 并不适合一切(看看GUI 框架,它们大多具有基于组件的结构)。
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
相关资源
最近更新 更多