落叶 2011-07-12 20:24:05 9452次浏览 1条回复 2 0 0

最近再看敏捷开发那本书,发现那个外国人写的真不错推荐大家去看看,网上已经有一些无私的PHPer已经翻译出来了,网址:[url=www.yiibook.com]yii book[/url],里面有一部分讲到关于自定义访问控制器的使用,讲的不错,现在拿出来和大家分享一下,请大家多多指教,多多补充....... 在我们用gii建立crud的时候,yiic已经帮助我们完成了大量的代码,其中包括我们今天要说的CController::filters的方法和一个Yii Sytstem 默认提供的过滤方法accessControl,而accessControl通过加载CController::accessRules()的方法对控制器里的每个方法进行访问控制,其中包括基于用户名(*,@,admin)、基于角色、基于IP地址等,这些不是今天要说的重点今天要说的重点是在自定义filter方法。 我们以blog为例,通常情况下POST和COMMENTS是一对多的关系,如何找出指定POST下的COMMENTS,所发的评论在指定的的POST下而不用担心它的ID号是多少,不同的人有不同的方法,我今天使用的一个自定义Fillter方法,通常Filter方法是名是以filter开头的,所以我这里定义

public function filterPostComment($filterChain)

所以先在CommentControl里先定义一个private $_postFix//用来存放POST然后

public function filterPostComment($filterChain)
{
    $postId=null;
    if(isset($_GET['pid']))
    {
        $postId=$_GET['pid'];
    }else if(isset($_POST['pid']))
    {
        $postId=$_POST['pid'];
    }
    $this->loadPost($$postId);
    $filterChain->run();//这个不要忘记加上,加这个方法是使该方法加入到过滤链中,并使过滤链的Index+1
}
protected function  loadProject($post_id)
{
    if($this->_postFix===null)
    {
        $this->_postFix=Post::model()->findByPk(($post_id);
        if($this->_postFix===null)
        {
            throw new CHttpException(404,'您要访问的页面不存在');
        }
    }
    
    return $this->_postFix;
}

最后不要忘记把这个方法应要到你想要控制的动作上

public function filters()
{
    return array(
        'accessControl', // perform access control for CRUD operations
        'PostComment + create index admin'
    );
}

结论:这样每次访问create index amdin的方法都会先执行PostComment 过渡器,如果指定的PostId不存就不在执行动作抛出异常,否则执行相应的动作,并用相应的反回值,此时的POST都是指定的POST

您需要登录后才可以回复。登录 | 立即注册