Php 如何避免在每个控制器中使用findOne';什么行动?

Php 如何避免在每个控制器中使用findOne';什么行动?,php,yii,yii2,Php,Yii,Yii2,我有一个非常基本的master->detail关系: 关系:客户(1)--->(n)评论 我有我的控制器,但在某些操作中,我不断使用关联id重复find模型,如果找不到,则抛出一些异常 class ClientController extends \yii\web\Controller{ public function actionViewComment($id) { $model = Comment::findOne($id);

我有一个非常基本的master->detail关系:

关系:客户(1)--->(n)评论

我有我的控制器,但在某些操作中,我不断使用关联id重复find模型,如果找不到,则抛出一些异常

    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]);
                }
        }
}
我可以创建一个模型方法(findOrThrows)来查找或抛出异常,但我仍然必须在控制器的一半操作中使用它(随着应用程序的增长,可能会更多)。 我在想,有没有更好的办法?
基于路由和Id的某种全局对象变得可用,以便控制器(或视图)可以使用它?

您应该查看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);

您不关心条件、抛出的异常等。

您应该查看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);

您不关心条件、抛出的异常等。

您应该查看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);

您不关心条件、抛出的异常等。

您应该查看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);

您不关心条件、抛出的异常等。

很好,但按照建议的方式,我只能处理每个控制器的一个模型。在我的例子中,ClientController(希望)在不久的将来至少需要3个模型。我试图在web.php中的规则级别执行一些操作:
'rules'=>['pattern'=>'client/,'route'=>'client/show','defaults'=>['comments'=>comments::findOne($id)]
,但它以静默方式失败。经过一些测试和猜测之后,我假设$id变量此时在应用程序中不存在(使用它作为我的引用:)。还有其他想法吗?很好,但是按照建议的方式,我只能处理每个控制器的一个模型。在我的例子中,ClientController(希望)在不久的将来至少需要3个模型。我试图在web.php中的规则级别执行一些操作:
'rules'=>['pattern'=>'client/,'route'=>'client/show','defaults'=>['comments'=>comments::findOne($id)]
,但它以静默方式失败。经过一些测试和猜测之后,我假设$id变量此时在应用程序中不存在(使用它作为我的引用:)。还有其他想法吗?很好,但是按照建议的方式,我只能处理每个控制器的一个模型。在我的例子中,ClientController(希望)在不久的将来至少需要3个模型。我试图在web.php中的规则级别执行一些操作:
'rules'=>['pattern'=>'client/,'route'=>'client/show','defaults'=>['comments'=>comments::findOne($id)]
,但它以静默方式失败。经过一些测试和猜测之后,我假设$id变量此时在应用程序中不存在(使用它作为我的引用:)。还有其他想法吗?很好,但是按照建议的方式,我只能处理每个控制器的一个模型。在我的例子中,ClientController(希望)在不久的将来至少需要3个模型。我试图在web.php中的规则级别执行一些操作:
'rules'=>['pattern'=>'client/,'route'=>'client/show','defaults'=>['comments'=>comments::findOne($id)]
,但它以静默方式失败。经过一些测试和猜测之后,我假设$id变量此时在应用程序中不存在(使用它作为我的引用:)。还有其他想法吗?