例如,C中的表单数据在做完验证后,如何传递给M层?
目前采用的是在Action中就把数据组装成对应的领域对象,然后通过传参的方式给制定的model~
但是这样做的话无疑把复杂的组装过程交给了action的开发人员,这样做会使得分层之间的职责划分不够合理,c和m层的人员都需要去了解领域对象的相关接口。
另外,model做完业务后的反馈数据如何回传给action,尤其是多条数据返回,简单的返回一个数组总觉得不够优雅,导致两层之间的依赖过强,不利于开发~
有没有好的解决方案?
回复内容:
例如,C中的表单数据在做完验证后,如何传递给M层?
目前采用的是在Action中就把数据组装成对应的领域对象,然后通过传参的方式给制定的model~
但是这样做的话无疑把复杂的组装过程交给了action的开发人员,这样做会使得分层之间的职责划分不够合理,c和m层的人员都需要去了解领域对象的相关接口。
另外,model做完业务后的反馈数据如何回传给action,尤其是多条数据返回,简单的返回一个数组总觉得不够优雅,导致两层之间的依赖过强,不利于开发~
有没有好的解决方案?
关于数据结构,我的建议是,PHP代码,拒绝数据对象。PHP最牛的,或者说最具有优势的数据结构就是数组,所以传递数组不是不优雅,这就是PHP的最佳实践。
关于MVC之间的传递,我的建议是各层只把自己了解的数据以数组形式传递给其它层,接收数据的时候,做一次可用性验证,拼装成自己需要的数据结构(最好也是数组)。
你的问题我也纠结过,目前我的解决办法是这样的:
<code>/** * 创建新主题 * @return string */ public function actionNew() { if (Yii::$app->user->isGuest) { Yii::$app->user->loginRequired(); } $form = new TopicForm(); $form->author_id = Yii::$app->user->getId(); $form->ip_address = Yii::$app->request->getUserIP(); if ($form->load($_POST) && $form->validate()) { Services::getTopics()->create($form->getAttributes(), $form->content); $this->redirect(['/forum']); } return $this->render('new', [ 'model' => $form ]); } </code>
这段代码是基于Yii2的,作用是在社区发一个新贴。
我的做法是用model(实际上我写的名字是form,因为Yii2的form其实就是model)来收集提交上来的表单数据,然后进行验证
<code>$form = new TopicForm(); $form->author_id = Yii::$app->user->getId(); $form->ip_address = Yii::$app->request->getUserIP(); </code>
验证通过后会使用相应的服务将数据写入数据
<code>Services::getTopics()->create($form->getAttributes(), $form->content); </code>
已知这样做的好处是form基本可以重用,因为他不涉及其他东西,只是验证数据合法性,所以不管是web、api,我都能直接使用他。
Services同理,不管别的,拿到数据就往数据库写(当然复杂的还要在内部处理,这里不说),同样也能复用。
不过这种做法有个问题,就是你需要同时了解 Form 跟 Services 的功能,而Yii2默认的做法是你不需要了解他们,一个典型的Yii2从表单到数据库的代码是这样的:
<code>public function actionCreate() { $model = new User(); if ($model->load($_POST) && $model->save()) { $this->redirect(['index']); } return $this->render('create', ['model' => $model]); } </code>
看出来了吗?人家压根就不分层,你根本不用关心其他的,把数据load进去就好了,至于怎么验证,怎么存储,都是黑箱在操作,开发速度大大提升,但是代码耦合略高,比如web注册用户跟app上注册用户的情景可能是不同的(当然,Yii2提供了scenario机制,一定程度上可以避免这个问题)

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!
