YII2 如何书写并且配置在所有action请求之前和之后?

这个是我的ActionTimeFilter 那么如何在web.php中配置才能启用每个action都会通过这个过滤器? 在线等,急急急 搞了一天了~ 有大牛吗

<?php
namespace app\filters;

use Yii;
use yii\base\Action;
use yii\base\ActionFilter;

class ActionTimeFilter extends ActionFilter
{
    private $_startTime;

    public function beforeAction($action)
    {
        Yii::info('2222222222222');
        $this->_startTime = microtime(true);
        return array(
            'dd'=>2
        );
        return parent::beforeAction($action);
//        return parent::beforeAction($action);
    }

    public function afterAction($action, $result)
    {
        $time = microtime(true) - $this->_startTime;
        Yii::debug("Action '{$action->uniqueId}' spent $time second.");
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        return array(
            'dd'=>2
        );
//        $time = microtime(true) - $this->_startTime;
//        Yii::debug("Action '{$action->uniqueId}' spent $time second.");
//        Yii::$app->response->format=Response::FORMAT_JSON;
        return parent::afterAction($action, $result);
    }
}
阅读 2.9k
3 个回答

你需要先建一个通用的控制器

use yii\web\Controller;

class CommonController extend Controller {
  public function behaviors() {
    return [
      'timeFilter' => 'app\filters\ActionTimeFilter',
    ];
  }
}

其他控制器继承这个就行了

亲测可用:
class BaseActiveController extends \yii\rest\ActiveController
{
    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['timeFilter'] = [
            'class' => 'app\filters\ActionTimeFilter',
            'except'=>['test']
        ];

        return $behaviors;
    }
}
值得注意的是,behaviors() 中需要继承父类 behaviors() 方法返回的内容,否则父类 behaviors()就会被完全覆盖了。

给 app 实例注入一个行为, 行为里绑定对应事件的处理器即可.

实战:
1, 配置文件
clipboard.png

2, 控制器
clipboard.png

输入结果:

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题