如何将模型实例绑定到Controller Action中的参数

时间:2013-12-05 06:25:38

标签: php yii

是否可以自动将模型实例绑定到控制器操作中的参数?如果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)会自动调用]

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));
    }
}

如果您想要绑定其他条件,这稍微更长但更有用,例如仅允许编辑,不会删除帖子,或者是活动等。您可以使用findByAttributesfindAll附加条件可能是隐含的,不一定作为参数传递

或者,如果您真的需要这样的功能,您可以使用自定义操作编写组件类,您可以根据需要加载模型

<?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);
    }

}