获取文档注释方法封装(thinkphp5.*)

2019-10-14  本文已影响0人  安之烟波客

功能说明

一般情况下,做系统后台管理的时候需要记录每一个管理员用户的操作记录,如果在每个控制器的每个方法中都手动去执行一个写日志的方法的话,似乎有些麻烦,所以心血来潮写了这样一个类,与伙计们共勉,有更好的实现方法欢迎交流。

用到的PHP系统方法

规则:
注释规则以“@desc开头”
如:

<?php

namespace app\home\controller;



/**
 *  @desc 这个是类的注释
 *
 * @author jobsz
 */
class Index extends base {
     
    /**
     * @desc 方的注释--接口首页
     *
     * @param $module
     * @param $controller
     *
     * @return array|null
     */
    public function index(){
        echo '123';
    }
     /**
     * @desc 方法的注释--支付宝支付
     *
     * @param $module
     * @param $controller
     *
     * @return array|null
     */
public function ali() {

    }

}


代码示例

<?php

/*
 * 获取注释的方法 
 * 如果能获取到注释则放回注释,如果程序人员没有进行注释则返回控制器的类名和方法名称
 * 注释以“@desc ”打头
 */

/**
 * Description of DocumentTools
 *
 * @author jobsz
 */
class DocumentTools {

    //put your code here

    private $class = null; // 
    private $methodName = "";

    public function __construct(\think\Controller $class, $methodName) {
        $this->class = $class;
        $this->methodName = $methodName;
    }

    public function getDocument() {
        $returnData = [];
        $classRef = new ReflectionClass($this->class);
        $classDocument = $classRef->getDocComment();
        // 获取方法的名称
        $class_desc = [];
        preg_match_all('/@desc(.*?)\n/', $classDocument, $class_desc);
        $c_desc = !empty($class_desc[1][0]) ? trim($class_desc[1][0]) : "";
        $returnData[] = $c_desc ?  $c_desc : basename(get_class($this->class)) ;
        if (!method_exists($this->class, $this->methodName)) {
            $returnData[] = $this->methodName;
        }

        $methodDocument = new ReflectionMethod($this->class, $this->methodName);
        $method_desc = [];
;
        preg_match_all('/@desc(.*?)\n/', $methodDocument, $method_desc);
        if ($method_desc) {

            $m_desc = !empty($method_desc[1][0]) ? trim($method_desc[1][0]) : $this->methodName;
           
        } else {
            $m_desc = $this->methodName;
        }
         $returnData[] = $m_desc;
         return implode("-", $returnData);
    }

}

使用方法:

首先创建一个base类让其继承与think\Controller类,然后让其他实际实现功能的控制器继承与base类,所有的日志写入记录都在base类的初始化函数中进行,

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace app\home\controller;

/**
 * Description of base
 *
 * @author jobsz
 */
class base extends \think\Controller {

    public function initialize() {
        parent::initialize();
        $action = request()->action();
        
       $class_name = get_called_class();
       $func = new \DocumentTools($this,$action);
       halt ($func->getDocument()); // 获取到的注释文档
    }

}

上一篇 下一篇

猜你喜欢

热点阅读