关于在PHP的Yii框架中保存模型,我有几个快速的概念性问题.我已经遇到过几次这个代码$ model-> save()(例如if($ model-> save())....
但我从来没有完全理解它的含义.
另外,我在MVC提示/手册中读到我们应该尝试将模型保存在模型中而不是控制器中 - 有人可以解释为什么会这样吗?我有一个朋友告诉我这没关系 - 但是,我想了解背后的规则.
谢谢你的帮助!
怎么$model->save()办?
只需检查源代码,它就在github上.应用逻辑,答案是可以预测的.
正如文档明确指出:BaseActiveRecord代表一个数据对象.它可以是从MySQL查询返回的行,也可以是由客户端或MongoDB文档或其他任何内容发送的已处理表单.
调用save该对象要么将数据插入到您选择的数据库中,要么尝试更新该记录.根据插入/更新调用成功,它返回一个布尔值(true如果保存成功,false如果失败).
真的很直观.如果您想了解有关您正在使用的工具/框架的更多信息,常识要求您查看他们的在线文档.Yii的文档在我看来非常全面且易于导航:在这里查看它们.
为什么要在模型中保存模型?
嗯,这很容易,但它需要一些消歧.术语"模型"通常用于指代数据容器.save在这种情况下您调用的对象.它们是数据模型,足够真实,它们用于在整个应用程序中来回传输数据.在Yii中,一些呼叫模型被称为"ActiveRecords".
在缩写MVC(如您所知的模型视图控制器)中,Model部分实际上涵盖的不仅仅是数据容器.该"模型"(用大写M)指的是模型层,也被称为逻辑或业务层.它是您的应用程序中实际包含大量代码的部分.它处理的是更复杂的计算,它是您连接和查询数据库的层.而且这个层具有控制器将调用的方法.然后,这些方法将返回包含数据的数据模型(小写m)或控制器将传递给视图的计算结果.
如果你想知道什么逻辑/工作/班弥补模型层,只需问自己这个简单的问题:"什么没有做到这一点吗?" 如果它不处理原始请求,并且它不向用户显示数据(分别是控制器和视图的作业),则它是Model层的一部分,但路由器组件除外,当然,调度员以及将MVC框架联系在一起的所有内容.
因此,控制器动作(显然是控制器中的方法)应该非常小.他们真正做的就是9/10次,将请求数据(表单提交等)倒入模型中,并在服务上调用一个或多个方法(这是Model层的一部分).这些方法将接收在控制器中创建的模型作为参数,并设置为使用它们.
控制器可以执行一些基本验证,但模型层将点对i并跨越t.
一旦Model层完成了它的工作,它就会回到控制器上,只剩下两件事要做:Model层是否返回了它预期的数据?如果是这样,将其传递给视图.如果不是(抛出异常或没有返回任何内容) - >处理错误/异常,并在需要时重定向用户.
简而言之:Model层是代码的主体,它通过数据模型与控制器(以及内部)进行通信.Model层永远不会直接与视图通信,也不会重定向用户或处理$_POST数据等原始输入.
这里有几个链接到我的帖子,我进一步解释这一点,完成图表,什么不是.它们是代码复审答案,因此请忽略处理代码本身的位,但背景信息可能与您相关:
CodeReview:如何将XML结果放入MVC模式?
CodeReview:PHP MVC:如何以正确的方式做$ _POST