2 回答
TA貢獻1854條經驗 獲得超8個贊
關于數據結構,我的建議是,PHP代碼,拒絕數據對象。PHP最牛的,或者說最具有優勢的數據結構就是數組,所以傳遞數組不是不優雅,這就是PHP的最佳實踐。
關于MVC之間的傳遞,我的建議是各層只把自己了解的數據以數組形式傳遞給其它層,接收數據的時候,做一次可用性驗證,拼裝成自己需要的數據結構(最好也是數組)。
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機制,一定程度上可以避免這個問題)
- 2 回答
- 0 關注
- 133 瀏覽
添加回答
舉報
