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 关注
- 187 浏览
添加回答
举报
