MVP:Presenter 是否应该执行 bootstrap 任务?

MVP: should the Presenter carry out bootstrap tasks?

我正在将定制的 PHP 网站转换为使用 MVP。这对我来说比 MVC 更可取。加上大多数自称是 MVC 的教程和框架,在我看来似乎更像是 MVP。

无论如何,我的站点站点有一个 bootstrap 包含:

  1. 命名空间 classes
  2. 的 PSR-0 自动加载器
  3. 永远不会改变的硬编码配置(全部在关联数组中$settings
  4. 创建数据库连接、变量清理器、格式化程序等通用对象
  5. 数据库连接
  6. 正在从数据库加载设置(可在 CMS 中编辑)
  7. URL路由

在 MVP 中,Presenter 会“接管”bootstrap 并执行这些任务中的任何一项吗?

如果我正确理解 MVP,Presenter 应该是一个 class 来处理所有用户输入,因此这将包括 URL 路由。其他几点,对我来说,似乎更像是 bootstrap 的责任。我唯一关心的是将所有这些对象和设置注入 Presenter。

tl;dr 使用顶级 AppController 来处理所有页面所需的路由和设置,并让演示者处理与特定 page/view.


对一般内容使用顶级控制器

这个 GWT MVP tutorial 有一个额外的 AppController 可以处理所有不特定于某个 view/presenter 的事情。我觉得这是个好主意。 GWT虽然是针对客户端的,但是同样的道理也可以用在服务端。

MVP 中的 Presenter 非常特定于某个视图,它应该只与视图和模型(或它们各自的接口)对话,而您的所有项目都不特定于特定的 page/view。如果你把它全部放在 "the presenter" 中,那么你就是在滥用演示者,就像 "Web MVC" 中的控制器一样。

例子

例如,AppController 可以 select 基于 HTTP 参数(即路由)的正确呈现器,建立数据库连接并加载其他常规设置。然后可以将连接对象传递给表示器,它知道实例化正确的视图和模型,并将连接传递给模型。 View 和 Presenter 应该不知道任何关于连接的事情,模型应该不依赖于任何实现,只是注入了接口。

设置

Loading settings from a database (editable in the CMS)

这听起来应该属于某个模型。该模型知道它需要什么设置并且可以要求它们。如果设置与 UI 相关,则演示者或视图应询问它们。如果它是纯视觉的东西,那么它会进入视图,但如果它是 "display logic",那么它属于演示者,因为在 MVP 中,视图应该没有逻辑。