当模型是图层并通过 services 访问时,您是如何将模型的状态存储在MVC中的?你给服务类一个状态吗?当View可能使用或不使用该特定服务时,该状态如何传达给View?
我目前有一个模型实体来存储不同的状态,我的所有服务都在这个实体中记录他们的问题,成功和状态。我将这个实体存储在会话中,但整件事情都错了......
我正在考虑这种状态不仅仅是错误/成功。
答案 0 :(得分:3)
如果您的视图永远不知道控制器使用了哪种服务来改变模型层的状态,那么您最好的方法是使用当前视图观察模型来实现经典MVC(或接近它)。在这种情况下,每个使用过的服务都会在控制器执行操作时通知视图。 如果是这种情况,则以下内容不适用。
视图和控制器应共享工厂,工厂负责初始化服务。这意味着如果您的控制器使用了特定服务,那么您可以添加查询此工厂的功能,该服务已经初始化了。
if ( $this->serviceFactory->hasCached('recongnition') )
但这不应该是必要的,恕我直言,这将是一件非常有害的事情。你会迫使工厂成为UI逻辑的重要组成部分。
注意:在这种情况下,工厂强制执行,每个服务只创建一次,而不依赖于全局状态。 子>
出于某种原因,你从一个前提开始,每个观点都必须是无所不知的。这就是导致你目前困惑的原因。
而不是了解两件虚构服务的所有内容:
Accounting
:处理发票Library
:用于管理文件当您查看列出当前文档的页面时,为什么视图会关注Accounting
服务中是否存在错误状态?你将如何实际实现错误状态?
任何这些服务中的错误状态会影响“登录页面”的外观吗?
因此。这里的底线是这样的:即使控制器做某事,导致模型层中某处出现错误状态,视图应该只知道它,只有如果视图需要特定服务。
注意:
当然,因为在Web应用程序中,视图和控制器倾向于形成对(如果有用于处理“文档列表”的控制器),那么可能也会当控制器利用当前视图不知道的某些服务时,这将是极其罕见的场合......我实际上无法想到这种情况的用例。
实际上,模型层的状态不是保存在服务本身中,而是保存在它们操作的域对象中。
如果您使用共享工厂,这可以确保每个服务仅初始化一次,那么该视图使用的服务将是相同的。这也意味着,服务工作的域对象仍然可以存在(当然,取决于您的实现)。
例如,如果您尝试使用已存在的电子邮件创建用户帐户,则当存储抽象获得有关违反UNIQUE
约束的异常时,用于表示帐户详细信息的域对象将获取错误状态。为了显示一个好的“注册失败”页面,该服务将需要该域对象及其数据和错误状态。
我希望它有所帮助