class CustomController extends ActiveController
{
public $modelClass = 'app\models\Custom';
// public $serializer = [
// 'class' => 'yii\rest\Serializer',
// 'collectionEnvelope' => 'items',
// ];
public function behaviors()
{
return ArrayHelper::merge(parent::behaviors(), [
'authenticator' => [
'class' => QueryParamAuth::className(),
],
'rateLimiter' => [
'class' => RateLimiter::className(),
'enableRateLimitHeaders' => false,
],
]);
}
}
源代码中,控制器的behaviors是在哪里处理的?
比如说:QueryParamAuth对象是在哪里实例化的?并且调用了authenticator()方法。
你给的例子,其实不能完全说明 behaviors
的行为,这里是 filter
的行为,但 filter
在 yii2
和 yii
中的实现不一样,yii2
中的 filter
是特殊的 behavior
,被框架多加了一层的处理,这里我只说明下 filter
的调用, 普通的 behavior
我暂时还没有用到,不清楚
一句话,QueryParamAuth
中 authenticator()
方法,是在 Controller
调用 beforeAction
时触发的,你可以在 Controller
复写 beforeAction
方法为空操作,看看还会不会调用。
在底层的 Controller
中,beforeAction
执行了 $this->trigger(self::EVENT_BEFORE_ACTION, $event)
触发了 EVENT_BEFORE_ACTION
事件,在 yii\base\Component
中 trigger
会首先 ensureBehaviors()
,把 behaviors()
定义的行为附加到 Controller
上
}QueryParamAuth
最终继承自 ActionFilter
的,来看看 ActionFilter
在 attach
时会做什么
会在 Controller
上绑定一个 EVENT_BEFORE_ACTION
事件,行为是执行自己的 beforeFilter
方法
到这里,你看到了,ActionFilter
最终会执行自己的 beforeAction
方法,当然这可不是 Controller
中的 beforeAction
方法,还会处理些前置check,如 except
和 only
检测,这个 beforeAction
正是你写 filter 时需要复写的一个方法,至于 QueryParamAuth
的 authenticator()
方法,自己可以接着走代码
入口是 Controller
的 beforeAction
方法,可以自己走一遍源代码,就这些