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 關注
- 122 瀏覽
添加回答
舉報