如何避免在每个控制器的操作中使用findOne?

时间:2015-07-17 06:26:01

标签: php yii yii2

我有一个非常基本的主人 - >细节关系:

  

关系:客户(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)可以使用它?

1 个答案:

答案 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.');
    }
}

"全球"方法将无用,因为:

  • 缺少自动完成功能并突出显示IDE中的支持。
  • 有时您需要自定义异常消息以指定不存在的确切对象类型。

行动中的典型用法:

$model = $this->findModel($id);

你并不关心条件,抛出异常等等。