search

Home  >  Q&A  >  body text

php - YII如何给所有的Controller都设置同一个过滤器,而不是将过滤器的代码复制到一个个的controller?

首先来看代码:


class UserController extends Controller { public function filterIsSessionWrong($filterChain){ if (isset(Yii::app()->user->userId)&&(!empty(Yii::app()->user->userId))) { $filterChain->run(); } else { _echo(2, '用户id获取失败,您需要重新登录'); $this->redirect(array('user/login')); } } public function filters() { return array( 'IsSessionWrong - login,register', ); }

由于客户端是手机。手机访问是通过session来访问的。当这个session不存在的时候,就告诉客户端需要重新登录一下(默认是10天)。
但是我这样做只能在UserController中间(除去注册与登录不需要判断外)去过滤。事实上所有的controller都要检验一下。如果都要检验一下的话,我不得不将这一段代码复制到所有的controller。请问有没有好的方法,将这个判断session的设置为所有的Controller都起作用?

阿神阿神2899 days ago382

reply all(1)I'll reply

  • 迷茫

    迷茫2017-04-10 14:53:12

    你可以定义一个filter继承自CFilter,

    class SessionCheckFilter extends CFilter {
        protected function preFilter($filterChain) {
    
             if (isset(Yii::app()->user->userId) && (!empty(Yii::app()->user->userId))) {
                $filterChain->run();
            } else {
                _echo(2, '用户id获取失败,您需要重新登录');
                $this->redirect(array('user/login'));
            }
        }
    }
    

    然后在你的controller中通过 filters 方法使用

    class UserController extends Controller {
    
        public function filters() {
            return array(
                array('application.filters.SessionCheckFilter - edit, create')
            );
        }
    }
    

    reply
    0
  • Cancelreply