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

Ren*_*ani 36 php model-view-controller post controller

我的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

ter*_*ško 26

最好的选择是使用#2方法,并进行一些更改.
我会把它写成这样的东西:

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

如果您使用类似Request实例的东西来抽象用户的输入,则无需实际创建变量.

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

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

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

关于其他选项:

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

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

    如果将其与模型层一起使用,则代码将绑定到Web界面甚至特定的请求方法.

  • Controller将$ _POST数据转换为Model的对象,并仅将对象传递给Model

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

截止说明:

您必须了解的一点是,在基于Web的MVC应用程序的上下文中,应用程序的用户是浏览器.不是你.浏览器发送请求,由路由机制处理并由控制器传播.视图会生成对浏览器的响应.

另一件事是:模型既不是一个类也不是一个对象.模型是一个层.


更新

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

您应该能够拥有单个控制器,它可以处理所有形式的应用程序.但这只是条件,你实际上使用相同的应用程序所有3个用例.

为此,有两个条件:

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

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

在您描述的情况下,更改部分实际上是视图,因为预期REST或SOAP服务会产生与普通Web应用程序不同的响应.