亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問在C中的表單數據在做完驗證后,如何傳遞給M層?有沒有好的解決方案?

請問在C中的表單數據在做完驗證后,如何傳遞給M層?有沒有好的解決方案?

PHP
拉莫斯之舞 2023-04-08 14:10:21
目前采用的是在Action中就把數據組裝成對應的領域對象,然后通過傳參的方式給制定的model~但是這樣做的話無疑把復雜的組裝過程交給了action的開發人員,這樣做會使得分層之間的職責劃分不夠合理,c和m層的人員都需要去了解領域對象的相關接口。另外,model做完業務后的反饋數據如何回傳給action,尤其是多條數據返回,簡單的返回一個數組總覺得不夠優雅,導致兩層之間的依賴過強,不利于開發~
查看完整描述

2 回答

?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

關于數據結構,我的建議是,PHP代碼,拒絕數據對象。PHP最牛的,或者說最具有優勢的數據結構就是數組,所以傳遞數組不是不優雅,這就是PHP的最佳實踐。
關于MVC之間的傳遞,我的建議是各層只把自己了解的數據以數組形式傳遞給其它層,接收數據的時候,做一次可用性驗證,拼裝成自己需要的數據結構(最好也是數組)。

查看完整回答
反對 回復 2023-04-11
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

你的問題我也糾結過,目前我的解決辦法是這樣的:

/**
 * 創建新主題
 * @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
    ]);
}

這段代碼是基于Yii2的,作用是在社區發一個新貼。

我的做法是用model(實際上我寫的名字是form,因為Yii2的form其實就是model)來收集提交上來的表單數據,然后進行驗證

$form = new TopicForm();
$form->author_id = Yii::$app->user->getId();
$form->ip_address = Yii::$app->request->getUserIP();

驗證通過后會使用相應的服務將數據寫入數據

Services::getTopics()->create($form->getAttributes(), $form->content);

已知這樣做的好處是form基本可以重用,因為他不涉及其他東西,只是驗證數據合法性,所以不管是web、api,我都能直接使用他。

Services同理,不管別的,拿到數據就往數據庫寫(當然復雜的還要在內部處理,這里不說),同樣也能復用。

不過這種做法有個問題,就是你需要同時了解 Form 跟 Services 的功能,而Yii2默認的做法是你不需要了解他們,一個典型的Yii2從表單到數據庫的代碼是這樣的:

public function actionCreate(){    $model = new User();    if ($model->load($_POST) && $model->save()) {        $this->redirect(['index']);
    }    return $this->render('create', ['model' => $model]);
}

看出來了嗎?人家壓根就不分層,你根本不用關心其他的,把數據load進去就好了,至于怎么驗證,怎么存儲,都是黑箱在操作,開發速度大大提升,但是代碼耦合略高,比如web注冊用戶跟app上注冊用戶的情景可能是不同的(當然,Yii2提供了scenario機制,一定程度上可以避免這個問題)


查看完整回答
反對 回復 2023-04-11
  • 2 回答
  • 0 關注
  • 122 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號