Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller MVC中每个控制器有多少个操作_Model View Controller_Design Patterns_Controller_Zend Framework2_Zend Framework3 - Fatal编程技术网

Model view controller MVC中每个控制器有多少个操作

Model view controller MVC中每个控制器有多少个操作,model-view-controller,design-patterns,controller,zend-framework2,zend-framework3,Model View Controller,Design Patterns,Controller,Zend Framework2,Zend Framework3,我知道这个问题的标题有点模糊,但我想不出更清楚的。(尽管这看起来像是一个ZF问题,但实际上只是一个php MVC问题。) 我最近将一个项目从ZF2迁移到ZF3。主要区别在于每个模型和控制器都需要依赖注入。由于我现在已经注入了所有依赖项,而不是使用serviceLocator(懒洋洋地加载服务)调用它们,所以我遇到了几个问题 现在有几个控制器看起来非常臃肿,正在实例化他们不使用的服务。仅仅因为不同的操作需要一个服务,整个控制器现在就实例化了一个服务。尽管实例化一个服务的性能并不是很高,但它仍然感觉

我知道这个问题的标题有点模糊,但我想不出更清楚的。(尽管这看起来像是一个ZF问题,但实际上只是一个php MVC问题。)

我最近将一个项目从ZF2迁移到ZF3。主要区别在于每个模型和控制器都需要依赖注入。由于我现在已经注入了所有依赖项,而不是使用serviceLocator(懒洋洋地加载服务)调用它们,所以我遇到了几个问题

现在有几个控制器看起来非常臃肿,正在实例化他们不使用的服务。仅仅因为不同的操作需要一个服务,整个控制器现在就实例化了一个服务。尽管实例化一个服务的性能并不是很高,但它仍然感觉像是一种浪费

我的问题是,自从我开始使用MVC以来,这基本上就是我的问题,你会如何具体制作一个控制器?每个控制器有多少个操作?或者在这种情况下:每个控制器有多少个服务

我现在甚至在考虑将每个控制器拆分,这样所有操作都有自己的控制器。这是个好/坏主意吗


有什么想法吗

我个人倾向于让控制器专注于单个动作。但它应该能够做/调用完成行动所需的一切

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

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

但我选择让它能够完成整个事情,但让它专注于这一行动

当然,您可以将所有(i)CRUD操作放在一个控制器中,并且仍然正确地应用MVC。一、 就个人而言,把这些分开比较干净。从名称空间中,您应该能够推断出您正在查看的类的用途

下面是一个项目的示例:

在我看来,很明显,这里我们要看的是用户模块,控制器子名称空间集中在用户对象上。(此模块中的用户对象有同级:路由、角色等)


必须说,这样做既有赞成的,也有反对的

专业人士:

  • 把你需要的东西清理干净
  • 关注点分离
  • 相当干燥(不要重复)
  • 易于为不同主题重复使用动作控制器(例如,创建更抽象的“ViewController”,并按主题实现:产品、用户、地址等)
被告:

  • 相当干燥(不要重复)(看我在那里做了什么?需要使用预加载表单等)
  • Zend Framework 3等框架中的附加配置(要注册的附加控制器/工厂组合)
  • 设置时间更长,重构“更多”

控制器与其他任何类一样,只是一个类。更一般地说,每当您发现自己认为“这个类非常大,并且正在做很多不同的事情”时,您可能会希望将其重构为更小的组件。每个控制器一个可调度的操作是合理的,但是如果您关心的是加载服务的开销,那么您可能希望延迟加载它们: