Yii 使用操作筛选器执行事务

Yii 使用操作筛选器执行事务,yii,Yii,我想在Yii中创建一个TransactionFilter,将其应用于一个操作,将其包装到一个事务中,这样我就不必每次使用事务时都反复编写相同的代码,至少这是我的想法。我有 class TransactionFilter extends CFilter { public function filter($filterChain) { if(Yii::app()->getRequest()->getIsPostRequest()) {

我想在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();
        }
}
这是我的用户类中的筛选器方法:

public function filters()
{
    return array(
        'accessControl',
        'postOnly + delete',
        array('application.components.TransactionFilter + create'),
    );
}
我假设$filterChain->run()最终将执行该操作,但当操作中出现重定向时,问题就出现了,在筛选器中的$filterChain->run()语句之后,重定向从未成功

我不知道这种方法在Yii中是否可行,如果不可行,如果有其他方法或者我必须坚持传统方法,我将非常感谢您的帮助


谢谢。

您必须在以下时间开始交易:

protected function preFilter($filterChain)
和提交、回滚:

protected function postFilter($filterChain)

我认为这有点不安全。当您有重定向时,事务应该提交还是回滚?如果transacion正在运行,您可以验证重定向方法并提交,这可能不是最好的解决方案。。。还有更多的方法,如
重定向
,其工作方式与之类似,如
刷新