Php 如何避免在每个控制器中使用findOne';什么行动?
我有一个非常基本的master->detail关系: 关系:客户(1)--->(n)评论 我有我的控制器,但在某些操作中,我不断使用关联id重复find模型,如果找不到,则抛出一些异常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);
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变量此时在应用程序中不存在(使用它作为我的引用:)。还有其他想法吗?