每个控制器在MVC中执行多少操作

时间:2018-11-08 14:13:22

标签: model-view-controller design-patterns controller zend-framework2 zend-framework3

我知道问题的标题含糊不清,但我想不到任何更干净的方法。 (即使它看起来像是ZF问题,实际上也只是一个php MVC问题。)

我最近将一个项目从ZF2迁移到ZF3。主要区别在于每个模型和控制器中都需要依赖项注入。由于我现在注入了所有依赖关系,而不是使用serviceLocator调用它们(延迟加载服务),因此我遇到了两个问题。

现在有几个控制器确实很肿,正在实例化它们不会使用的服务。仅仅因为一个不同的动作需要一个服务,整个控制器现在就实例化了一个服务。即使实例化服务的性能并不是那么高,但仍然感觉很浪费。

我的问题是,自从我开始使用MVC以来,这基本上一直是我的问题,您将如何制作控制器?每个控制器多少个动作?或者在这种情况下,可能是:每个控制器有多少服务?

我现在甚至在考虑拆分每个控制器,因此所有操作都具有自己的控制器。这是一个好主意吗?

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我个人是为了使Controller专注于单个Action。但是它应该能够执行/调用完成操作所需的一切。

例如,您有一个产品实体。对于基本的CRUD(我选择iCRUD,原因为何?:p),我将创建5个控制器:索引,添加,查看,编辑,删除(无论是否使用添加/创建,查看/读取等语义)。

最大的编辑是Edit,它必须“获取”现有的Product,将其加载到Form中并返回,仅用于设置编辑页面。在数据发布时,必须获取现有产品,将其加载到表单中,获取请求数据并将其加载到表单中,验证,准备存储,存储并返回响应。

但是我选择让它能够完成整个任务,但将其重点放在该Action上。

当然,您可以在单个控制器中拥有所有(i)CRUD操作,并且仍然可以正确应用MVC。我个人认为将它们分开更干净。从命名空间中,您应该能够推断出您正在寻找的类是什么。

以下项目的示例:

enter image description here

在我看来,很明显,我们在这里查看的是User模块,Controller子命名空间着重于User对象。 (此模块中的User对象具有同级元素:Route,Role等。)


必须说,做到这一点既有优点也有缺点。

专业人士:

  • 清洁并清除需要去哪里的东西
  • 关注点分离
  • 完全干燥(请勿重复)
  • 易于针对不同主题重复使用动作控制器(例如,创建更抽象的“ ViewController”并针对每个主题实施:产品,用户,地址等)

骗局:

  • 完全干燥(不要重复自己)(看看我在那儿做了什么?还需要预先加载表格等)
  • Zend Framework 3等框架中的其他配置(要注册的其他Controller / Factory组合)
  • 设置时间更长,重构“更多”