listen()
listen() : array<mixed,string>
监听事件
API访问日志保存
<?php
/**
 * MineAdmin is committed to providing solutions for quickly building web applications
 * Please view the LICENSE file that was distributed with this source code,
 * For the full copyright and license information.
 * Thank you very much for using MineAdmin.
 *
 * @Author X.Mo<root@imoi.cn>
 * @Link   https://gitee.com/xmo/MineAdmin
 */
namespace Api\Listener;
use App\System\Service\SystemApiLogService;
use Hyperf\Event\Annotation\Listener;
use Hyperf\Event\Contract\ListenerInterface;
use Mine\Event\ApiAfter;
use Mine\Helper\Str;
use Mine\MineRequest;
/**
 * API访问日志保存
 * @Listener
 */
class ApiLogListener implements ListenerInterface
{
    /**
     * 监听事件
     * @return string[]
     */
    public function listen(): array
    {
        return [
            ApiAfter::class
        ];
    }
    /**
     * 事件处理
     * @param object $event
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    public function process(object $event)
    {
        /* @var $event ApiAfter */
        $data = $event->getApiData();
        $request = container()->get(MineRequest::class);
        $service = container()->get(SystemApiLogService::class);
        if (empty($data)) {
            // 只记录异常日志,但并不抛出异常,程序正常走下去
            logger('Api Access Log')->error('API数据为空,访问日志无法记录,以下为 Request 信息:'. json_encode($request));
        } else {
            // 保存日志
            $reqData = $request->getParsedBody();
            unset($reqData['apiData']);
            $response = $event->getResult();
            $service->save([
                'api_id' => $data['id'],
                'api_name' => $data['name'],
                'access_name' => $data['access_name'],
                'request_data' => [ 'data' => $reqData, 'params' => $request->getQueryParams() ],
                'response_code' => $response->getStatusCode(),
// 返回内容以免过大,暂不保存访问内容
//                'response_data' => $response->getBody()->getContents(),
                'ip' => $request->ip(),
                'ip_location' => Str::ipToRegion($request->ip()),
                'access_time' => date('Y-m-d H:i:s')
            ]);
        }
    }
}