是否可以自动将模型实例绑定到控制器操作中的参数?如果Yii本身不存在,他们是否有任何解决方法? 我知道这在Laravel和ASP.NET MVC中是可行的。这就是我想要实现的目标:
class PostController extends Controller {
public function actionEdit(Post $post) {
if($_POST['Post']){
$post->attributes = $_POST['Post'];
$post->save();
}
$this->render('edit', array('post'=>$post));
}
}
给出类似localhost/?r=post/edit&post=1
的网址
[例如Yii::app()->createUrl('post/edit',array('post'=>$mypost->id))
] id
1被转换为CActiveRecord
的实例[即Post::model()->findByPk(1)
会自动调用]
答案 0 :(得分:0)
从您的代码段中,您似乎正在尝试将$ _POST和$ _GET变量传递给您的操作。
$ _POST,$ _ GET中的值存储为关联数组而不是对象本身。 在Yii中你无法直接加载模型,但是你可以像这样实现你的目标。
class PostController extends Controller {
public function actionEdit($post) {
$postModel = Post::model()->findByPk($post)
$this->render('edit', array('post'=>$postModel));
}
}
如果您想要绑定其他条件,这稍微更长但更有用,例如仅允许编辑,不会删除帖子,或者是活动等。您可以使用findByAttributes
或findAll
附加条件可能是隐含的,不一定作为参数传递
或者,如果您真的需要这样的功能,您可以使用自定义操作编写组件类,您可以根据需要加载模型
<?php
class LoadModel extends CComponent {
public function loadModel($type,$id){
if(!in_array($type,$arrayofpossibleModels || !is_numeric($id)){ //Validation if $type is a model name is required.
throw new CHttpException("400","Bad Request")
}
return $type::model()->findByPk($id);
}
}