2 回答

TA貢獻(xiàn)1854條經(jīng)驗 獲得超8個贊
關(guān)于數(shù)據(jù)結(jié)構(gòu),我的建議是,PHP代碼,拒絕數(shù)據(jù)對象。PHP最牛的,或者說最具有優(yōu)勢的數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,所以傳遞數(shù)組不是不優(yōu)雅,這就是PHP的最佳實踐。
關(guān)于MVC之間的傳遞,我的建議是各層只把自己了解的數(shù)據(jù)以數(shù)組形式傳遞給其它層,接收數(shù)據(jù)的時候,做一次可用性驗證,拼裝成自己需要的數(shù)據(jù)結(jié)構(gòu)(最好也是數(shù)組)。

TA貢獻(xiàn)1865條經(jīng)驗 獲得超7個贊
你的問題我也糾結(jié)過,目前我的解決辦法是這樣的:
/** * 創(chuàng)建新主題 * @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的,作用是在社區(qū)發(fā)一個新貼。
我的做法是用model(實際上我寫的名字是form,因為Yii2的form其實就是model)來收集提交上來的表單數(shù)據(jù),然后進(jìn)行驗證
$form = new TopicForm(); $form->author_id = Yii::$app->user->getId(); $form->ip_address = Yii::$app->request->getUserIP();
驗證通過后會使用相應(yīng)的服務(wù)將數(shù)據(jù)寫入數(shù)據(jù)
Services::getTopics()->create($form->getAttributes(), $form->content);
已知這樣做的好處是form基本可以重用,因為他不涉及其他東西,只是驗證數(shù)據(jù)合法性,所以不管是web、api,我都能直接使用他。
Services同理,不管別的,拿到數(shù)據(jù)就往數(shù)據(jù)庫寫(當(dāng)然復(fù)雜的還要在內(nèi)部處理,這里不說),同樣也能復(fù)用。
不過這種做法有個問題,就是你需要同時了解 Form 跟 Services 的功能,而Yii2默認(rèn)的做法是你不需要了解他們,一個典型的Yii2從表單到數(shù)據(jù)庫的代碼是這樣的:
public function actionCreate(){ $model = new User(); if ($model->load($_POST) && $model->save()) { $this->redirect(['index']); } return $this->render('create', ['model' => $model]); }
看出來了嗎?人家壓根就不分層,你根本不用關(guān)心其他的,把數(shù)據(jù)load進(jìn)去就好了,至于怎么驗證,怎么存儲,都是黑箱在操作,開發(fā)速度大大提升,但是代碼耦合略高,比如web注冊用戶跟app上注冊用戶的情景可能是不同的(當(dāng)然,Yii2提供了scenario機(jī)制,一定程度上可以避免這個問題)
- 2 回答
- 0 關(guān)注
- 131 瀏覽
添加回答
舉報