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 方法,可以自己走一遍源代码,就这些