使用操作筛选器执行事务

时间:2013-04-24 17:14:44

标签: yii

我想在Yii中创建一个TransactionFilter,将其应用于一个动作以将其包装在一个事务中,所以我不必每次想要使用事务时都反复编写相同的代码,至少这是个想法。我有

class TransactionFilter extends CFilter
{
    public function filter($filterChain)
    {
        if(Yii::app()->getRequest()->getIsPostRequest())
        {
            $transaction= Yii::app()->db->beginTransaction();
            try {
                $filterChain->run();
                $transaction->commit();
            }catch(Exception $e) {
                $transaction->rollback();
            }
        }
        else
            $filterChain->run();
        }
}

这是我的User类中的过滤器方法:

public function filters()
{
    return array(
        'accessControl',
        'postOnly + delete',
        array('application.components.TransactionFilter + create'),
    );
}

我假设$ filterChain-> run()最终将执行操作但是当操作中有重定向时出现问题,它从未在过滤器中的$ filterChain-> run()句子之后出现

我不知道这种方法在Yii中是否可取和可行,如果不是,如果有其他方法或者我必须坚持使用传统方法,我会很感激帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

您必须开始交易:

protected function preFilter($filterChain)

并提交,回滚:

protected function postFilter($filterChain)