从另一个Controller调用Controller函数是一种好习惯吗?


23

我遇到的情况是,我要在一个控制器中处理搜索逻辑,然后根据搜索生成一些数据并作为统计信息返回。

从另一个控制器调用控制器功能是一种好习惯吗?还是两个控制器不应该“交谈”?

Answers:


24

尽管答案取决于您使用的语言/框架,但是这很奇怪,因为不同的语言/框架具有不同的MVC方法。

通常,由于以下原因,您不会使用另一个控制器:

  • 控制器通常返回打算由MVC框架使用的类型的结果。此结果包含许多您作为调用者不需要的信息(例如视图的名称),并且并不总是很容易获得您可能感兴趣的信息(在您的情况下,模型,如果我猜对的话)。

  • 控制器不易从业务代码初始化,因为它们通常需要一些有关HTTP请求和上下文的信息。所有这些信息预计将由MVC框架传递。

更重要的是,如果您需要在两个控制器中找到一堆搜索结果,一个控制器向最终用户显示结果,另一个控制器生成统计信息,则只需将搜索逻辑放在您的业务层(首先属于该层),顺便说一句),并保持您的控制器越小越好。

在MVC中,控制器的作用是协调流程:

  • 从请求中获取相关输入,
  • 向验证者委托验证/清除输入的任务,
  • 调用业务层的相关方法,
  • 给MVC框架生成的模型和视图。

控制器的作用是不处理业务逻辑。

将代码移到业务层后,您可以提供一个搜索界面,该界面可以以清晰,直接的方式重用,而与另一个控制器所使用的控制器不同。


嗨,谢谢您的回复。假设我将搜索逻辑移至业务层,那么放置搜索界面的最佳位置在哪里?我正在使用Laravel。
IAmJulianAcosta 2014年

不幸的是,我从未使用过Laravel。而且,我认为答案将更多地取决于应用程序的体系结构,而不是框架。
阿森尼·穆尔琴科2014年

假设您位于根目录下的http文件夹下。您可以在此处创建名为contract的文件夹,并将所有充当接口的文件都放置在此处
Faris Rayhan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.