当前位置: 首页 > 面试题库 >

在MVC中处理$ _POST数据的正确方法是什么?

邢凌
2023-03-14
问题内容

在PHP系统中,我有一个常见的MVC情况:ControllerView包含的$_POST数据中接收请求。现在,我有三种方法来处理数据:

a)Controller仅调用ModelModel处理$_POST数据。
b)在Controller变换的$_POST数据转换成变量,并将它们传递到Model
c)Controller$_POST数据转换为Model的域对象,并将该对象仅传递给Model

目前,我正在使用选项A,但是我认为这是错误的,因此我正在考虑使用选项C。

因此,根据MVC,处理$_POST数据的正确方法是什么?

编辑 目前,我没有使用任何MVC框架。

编辑2 通常,相同的Controller请求处理浏览器,Web服务,脱机应用程序等的请求,或者每个请求都有它自己的请求Controller


问题答案:

最好的选择是使用 #2 方法,并进行一些更改。
我会这样写:

public function postLogin( $request )
{
     $service = $this->serviceFactory->build('Recognition');
     $service->authenticate( $request->getParam('username'),
                             $request->getParam('password') );
}
// Yes, that's the whole method

如果您已使用Request实例(例如实例)来抽象用户输入,则实际上无需创建变量。

另外,您可能希望Request::getParam()用类似的方法替换该方法Request::getPost()-尽管我得出的结论是,在结构正确的应用程序中,GETand
POST参数不应共享相同的名称。

serviceFactory你的代码片段看到是,你在这两个控制器和视图实例注入的对象。它可以让您在控制器和视图之间共享相同的服务实例。

它负责创建服务
(其中将包含应用程序逻辑,而将域业务逻辑保留在
域对象中)
,这有助于您从表示层隔离域实体和存储抽象之间的交互。

关于其他选项:

  • Controller仅调用Model,而Model处理$ _POST数据。

在MVC和MVC启发的设计模式中,模型应该既不了解用户界面,也不了解整个表示层。在$_POSTPHP中的变量是一个超全局变量。

如果将其用于模型层,则代码将绑定到Web界面,甚至是特定的请求方法。

  • 控制器将$ _POST数据转换为模型的对象,并将该对象仅传递给模型

不能完全确定您的意思。似乎您在谈论抽象的实例化,其中将包含用户的请求。但是在这种情况下,控制器将负责所述结构的实例化/创建,这将违反SRP。

结束语:

您必须了解的一件事是,在基于Web的MVC应用程序的上下文中,应用程序的 用户
是浏览器。不是你。浏览器发送请求,该请求由路由机制处理并由控制器分发。并且view 对您的浏览器 产生响应。

另一件事是:模型既不是类也不是对象。

更新资料

通常,相同的Controller处理来自浏览器,Web服务,脱机应用程序等的请求,或者每个控制器都有自己的Controller?

您应该能够使用一个控制器来处理所有形式的应用程序。但这只是在一定条件下,您实际上在所有3个用例中都使用相同的应用程序。

这样做有两个条件:

  • 您需要抽象该Request控制器接收到的实例
  • 该视图应在控制器外部实例化

这样,您可以使一个应用程序满足所有要求。每个变体都有不同的唯一之处是引导阶段,在该阶段您可以创建Request实例并选择正确的视图。

在您所描述的情况下,变化的部分实际上是视图,因为可以预期REST或SOAP服务将产生与普通Web应用程序不同的响应。



 类似资料:
  • 我在试图让我的文本字段与我在控制器类中定义的ActionEvent句柄连接时遇到问题。这个错误是由java造成的。朗,反思一下。调用TargetException。我一直试图在视图中创建控制器类的实例,然后使用lamba方法引用调用控制器类中的handle方法。 查看类 控制器类 主课 堆栈跟踪

  • 我正在使用带有knex javascript库的postgres来构建我的sql查询。我想要处理所有从postgres服务器抛出的错误,所以我想要这样做的方式是通过检查抛出错误的类型。 有没有办法处理这样的错误?

  • 问题内容: 我一直在使用spring-webflux进行一些研究,我想了解使用路由器功能处理错误的正确方法。 我创建了一个小项目来测试几个场景,并且我希望获得有关它的反馈,并查看其他人在做什么。 到目前为止,我在做什么。 提供以下路由功能: 我已经在我的处理程序上执行了 它们是我的错误处理程序: 这是完整的示例存储库: https://github.com/LearningByExample/re

  • 问题内容: 我使用10gen的本机node.js驱动器将mongodb(2.2.2)与node.js一起使用。 起初一切顺利。但是当涉及到并发基准测试部分时,会发生很多错误。频繁进行1000次并发连接/关闭可能会导致mongodb拒绝任何进一步的请求,并出现以下错误: 另外,如果许多客户端在没有显式关闭的情况下关闭,则mongodb将花费几分钟的时间来检测并关闭它们。这也将导致类似的连接问题。(使

  • 我试试看。js与mongodb(2.2.2)一起使用本机节点。js drive by 10gen。 起初一切都很顺利。但在并发基准测试部分,出现了很多错误。频繁连接/关闭1000次并发可能会导致mongodb拒绝任何进一步的请求,错误如下: 此外,如果很多客户端在没有显式关闭的情况下关闭,mongodb需要几分钟来检测并关闭它们。这也会导致类似的连接问题。(使用/var/log/mongodb/m

  • 所以,我想实现一个非常简单的输出。 我有与字段成功,消息和列表数据响应类。 和请求类 null null 我试过很多方法,但最后都没能做到。