我在我的PHP系统常见的MVC情况: Controller
接收来自请求View
包含$_POST
数据。 现在我有三种方式来处理数据:
一) Controller
仅调用Model
和Model
处理$_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()
-虽然我来,在正确的结构化应用程序,该结论GET
和POST
参数不应共享同一名称。
该serviceFactory
,你的代码片段看到是,你在这两个控制器和视图实例注入的对象。 这将让你分享的控制器和视图之间相同的服务实例。
它负责创建的服务 (这将包含应用程序逻辑,同时保留域业务逻辑的域对象 ),它可以帮助你从表现层隔离域实体与存储抽象之间的相互作用。
关于其他选项:
该控制器仅调用模型和模型处理$ _ POST数据。
在MVC和MVC风格的设计模式的模型应该意识到无论是用户界面的表示层作为一个整体的,也不是。 该$_POST
在PHP变量是一个超全局变量 。
如果用模型层使用它,你的代码变得绑定到Web界面,甚至具体的请求方法。
该控制器将$ _ POST数据到模型中的对象,只传递对象到模型
不完全知道你的意思与此有关。 看来你在谈论的抽象,它会包含用户的请求的实例。 但在这种情况下,控制器将成为负责实例/创建所述结构,这将违反SRP 。
关闭注意事项:
有一件事你必须明白的是,在基于Web MVC应用程序而言,应用程序的用户是浏览器。 不是你。 浏览器发送请求,这是由路由机制进行处理,并通过控制器的传播。 并查看产生到浏览器的响应。
而另一件事是:型号是不是类或对象。 模型是一个层 。
更新
一般情况下,同一个控制器从一个浏览器,web服务,离线应用等处理请求,或者每一个都有它自己的控制器?
你应该能有单独的控制器,与应用程序的所有形式的交易。 但是,只有在情况下,你实际上是使用所有3个用例同样的应用程序。
这样做有两个条件:
- 你需要抽象的
Request
实例,该控制器接收 - 该视图应控制器外面被实例化
这样你可以有一个应用程序来满足所有的需求。 唯一的事情,每个变体具有不同的,是引导阶段,在那里你创建Request
实例,并选择适当的视图。
在这种情况,你所描述的,不断变化的部分实际上是认为,因为REST或SOAP服务预计将产生比普通网络应用不同的反应。
曾几何时是三个层次的应用体系。
这一切都取决于你的MVC框架。 通常情况下,控制器就在用户和模型层,其操作域对象之间的联系。
在MVC的PHP初期,模型层实际上只是域对象,呼吁为此模型。 一些具有者优先所谓薄模式,其中仅提供的数据的OO表示,(这简化持久性)。 在这种情况下,控制器将重新组合的所谓的动作,含有大部分与HTTP请求(脂肪控制器)相关联的处理的。
其他嵌入最所述处理的与专用的方法(脂肪模型)的对象模型。
然而,在某些时候,你必须分析查询消毒和验证它的内容,这取决于你的观点如何格式化请求。 消毒可能是控制器的任务(这个请求应该只包含这些值),而验证,绝对是一个模型任务(值应该是这些类型的)。
一个有趣的问题是:你如何处理影响多个站点对象的动作? 你在哪里放的逻辑是什么?
如今,模型层由服务分离从控制器的恶把握域对象,于层之间的依赖关系限制为仅它们各自的接口的。 这是大多数请求处理的完成。
Symfony2中 ,例如,提供了一个合理的回答这个问题:在一个专用的代码被实现的请求时,其可描述为以下的处理的每个步骤:
- 该请求被第一变成一个对象
- 该目的是使用路由对象路由
- 它处理到控制器
- 控制器将请求传递给由动作有关的服务,该服务建立响应对象
然后,服务工作被分解在几个步骤:
- 验证(使用依赖于在一个单独的文件中描述的规则的专用目的),
- (使用序列向/从分贝如果必要的话)的域对象的施工/更新,
- 为响应模板的选择,
- 人口说与域相关的数据模板。
CakePHP的是如下的类似概念的另一个流行的框架:简单的控制器和服务封装域对象。
见这个问题上的一般概念更好地了解。
见这个问题,其他的答案。
由于tereško他对此事的宝贵意见。
我使用Zend和以下
第二个选项。
例如一个登记表
步骤-1的形式向我发送后值到指定的控制器
步骤-2我将验证通过服务器端验证例如(邮件和URL和空后的值)的形式的值。
步骤-3发送的检查后数据无论是在可变或具有全到模型中。
步骤4 -控制器调用模型。
步骤 -5模型插入后值,并创建一个新用户。
我觉得你的第二个选择是好,无论框架或approah使用。
注意 - 同一个控制器可以处理寄托都取决于你的应用程序逻辑。
but i prefer to keep different controller for differnt user request and user types
it helps in keeping code readable managebale .
看一些MVC框架。
例如,在Yii中,你可以写里面的动作这样的代码:
$model = new Model();
if(isset($_POST['Model'])) {
$model->attributes = $_POST['Model'];
}
请注意,所有attributes
模型必须通过验证规则进行传递。 在Yii的验证过程中应用(实际上,之前) $model->save()
看到:
- http://www.yiiframework.com/doc/guide/1.1/en/form.model#securing-attribute-assignments
- http://www.yiiframework.com/doc/guide/1.1/en/basics.mvc
“C”是最好的选择。 你不应该让模型的原始$ POST数据去为模型应该是通用的处理存储和加载操作为主。
例如:同样的模型能够使用Web界面和Web服务。 在网络$ _ POST是有效的,但对于Web服务的不是。 所以模型不关心数据是如何接收,但只有如何存储和加载它。
警予绝对是一个干净的MVC实现。