石头杨 2017-01-03 17:12:40 16133次浏览 9条评论 33 12 0

一个简单的行为案例。场景是在后台,每个用户操作了什么(也就是访问了那个链接),都会记录日志。
不多说,看代码:

common文件夹下新建behaviors文件夹,再创建该类。

<?php
namespace common\behaviors;

use Yii;
use yii\web\Controller;
use yii\base\Behavior;
use yii\web\Request;

class LogactionBehavior extends Behavior
{
    /**
     * 保存注入的 yii\web\Request 实例
     * @var yii\web\Request
     */
    private $request;

    /**
     * 运用传说中的依赖注入 注入 yii\web\Request
     * @param array $config
     * @param yii\web\Request  $request
     */
    public function __construct($config =[],Request $request)
    {
        parent::__construct($config);
        $this->request = $request;
    }

    /**
     * 给事件设置触发函数。
     * 将 beforeAction 函数注册到 Controller::EVENT_BEFORE_ACTION 事件中
     * 将 afterAction 函数注册到 Controller::EVENT_AFTER_ACTION 事件中
     * @return array
     */
    public function events()
    {
        return [
            Controller::EVENT_BEFORE_ACTION => 'beforeAction',
            Controller::EVENT_AFTER_ACTION => 'afterAction'
        ];
    }

    /**
     * 每次访问时,记录访问的情况到日志里。
     */
    public function beforeAction()
    {
        $date =date("Y/m/d h:i:sa");
        $url = $this->request->url;
        $ip = $this->request->userIP;
        $params = $this->request->getRawBody();
        $log = $date."   ".$url."  ".$params."   ".$ip;
        Yii::info($log);
        Yii::beginProfile('myBenchmark');//开启运行分析,会对数据库查询时间等信息计入日志,myBenchmark 可修改自己设定标识符,会写入日志
    }

    public function afterAction()
    {
        Yii::endProfile('myBenchmark');//结束运行分析
    }
}

注释写的很清楚。
控制器中注册行为

public function behaviors()
{
    return [
        LogactionBehavior::className(),
    ];
}

配置在不同的应用配置文件中,配置components属性

'log'=>[
    'targets' => [
        [
            'class'=> 'yii\log\FileTarget',
            'levels' => ['info','profile'],
            'logVars' => [],
        ]

    ]
]

指定不同的驱动,可将日志保存在不同地方。

简单用法就这样,有什么奇淫技巧大家可以一块讨论讨论。

觉得很赞
您需要登录后才可以评论。登录 | 立即注册