我有一个非常基本的主人 - >细节关系:
关系:客户(1)---> (n)评论
我有我的控制器,但在某些操作中,我不断重复使用相关id的查找模型,并在未找到时抛出一些异常。
class ClientController extends \yii\web\Controller{
public function actionViewComment($id) {
$model = Comment::findOne($id);
if ($model == null )
throw new NotFoundHttpException('The requested page does not exist.');
return $this->render('view-comment', ['model' => $model]);
}
public function actionEditComment($id) {
$model = Comment::findOne($id);
if ($model == null )
throw new NotFoundHttpException('The requested page does not exist.');
$model->scenario = 'update';
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view-comment', 'id' => $model->id]);
} else {
return $this->render('edit-comment', ['model' => $model]);
}
}
}
我可以创建一个Model方法(findOrThrows)来查找或抛出异常,但我仍然需要在我的控制器操作的一半中使用它(随着应用程序的增长,可能会更多)。 我在想,有没有更好的办法呢? 某种基于Route和Id变得可用的全局对象,以便Controller(或View)可以使用它?
答案 0 :(得分:3)
你应该看看CRUD生成的控制器,以了解它在Yii中是如何完成的。
在每个名为findModel()
的控制器中都有特殊的受保护方法,例如:
/**
* @param integer $id
* @return Post
* @throws NotFoundHttpException
*/
protected function findModel($id)
{
if (($model = Post::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested post not exist.');
}
}
"全球"方法将无用,因为:
行动中的典型用法:
$model = $this->findModel($id);
你并不关心条件,抛出异常等等。