0

当模型是一个层并通过services访问时,您打算如何将模型的状态存储在 MVC 中。你给服务类一个状态吗?当视图可能使用或可能不使用该特定服务时,该状态将如何传达给视图?

我目前有一个模型实体来存储不同的状态,我的所有服务都在这个实体中记录他们的问题、成功和状态。我将这个实体存储在会话中,但整个事情感觉不对......

我认为状态不仅仅是错误/成功。

4

1 回答 1

3

如果您的视图永远不知道控制器使用了哪个服务来更改模型层的状态,那么您最好的方法是使用当前视图观察模型来实现经典 MVC(或接近它)。在这种情况下,每个使用的服务都会在控制器对其进行操作时通知视图。如果是这种情况,则以下内容不适用。

坏主意..

视图和控制器应该共享负责初始化服务的工厂。这意味着如果您的控制器使用了特定的服务,那么您可以添加一个功能来查询这个工厂关于它已经初始化的服务。

if ( $this->serviceFactory->hasCached('recongnition') )

但这不应该是必要的,恕我直言,那将是一件非常有害的事情。您将迫使工厂成为 UI 逻辑的重要组成部分。

注意:在这种情况下,工厂强制每个服务只创建一次,不依赖于全局状态。

不同的方法/观点

出于某种原因,您从一个前提开始,即每个视图都必须是无所不知的。这就是导致您当前混乱的原因。

而不是知道关于这两个虚构服务的一切:

  • Accounting: 用于处理发票
  • Library: 用于管理文件

当您查看列出当前文档的页面时,为什么视图会关心服务中是否存在错误状态Accounting?您将如何实际实现该错误状态?

这些服务中的任何一个错误状态会影响“登录页面”的外观吗?

所以。这里的底线是这样的:即使控制器做了一些事情,导致模型层某处的错误状态,视图应该只知道它,只有当视图需要那个特定的服务时

注意:
当然,由于在 web 应用程序中视图和控制器往往是成对的(如果有处理“文档列表”的控制器,那么可能也会有一个对应的视图),这将是非常罕见的情况,当控制器使用当前视图不知道的某些服务……我实际上想不出这种情况的用例。

附言

实际上模型层的状态不是保存在服务本身,而是保存在它们操作的领域对象中。

如果您使用共享工厂,它可以确保每个服务只初始化一次,那么该视图使用的服务将是相同的。这也意味着,与服务一起工作的域对象仍然可以存在(当然取决于您的实现)。

例如,如果您尝试使用已存在的电子邮件创建用户帐户,则表示帐户详细信息的域对象将获取错误状态,当存储抽象收到有关违反UNIQUE约束的异常时。为了显示一个好的“注册失败”页面,服务将需要该域对象及其数据和错误状态。

I hope it helps

于 2013-10-15T19:06:58.980 回答