src/Subscriber/ActionLogSubscriber.php line 56

Open in your IDE?
  1. <?php
  2. namespace App\Subscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  5. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\Security\Core\Security;
  9. use Doctrine\ORM\AbstractQuery;
  10. use App\Controller\ActionLogController;
  11. use App\Entity\AdminAction;
  12. use App\Entity\AdminLog;
  13. class ActionLogSubscriber implements EventSubscriberInterface
  14. {   
  15.     public function __construct(
  16.         private EntityManagerInterface $entityManager,
  17.         private Security $security,
  18.     ){}
  19.     public function onKernelController(ControllerEvent $event)
  20.     {
  21.         try {
  22.             $controller $event->getController();
  23.             // when a controller class defines multiple action methods, the controller
  24.             // is returned as [$controllerInstance, 'methodName']
  25.             if (!$controller[0] instanceof ActionLogController) {
  26.                return;
  27.             }
  28.             $postData       json_decode($event->getRequest()->getContent(), true);
  29.             if (!$postData$postData $event->getRequest()->request->all();
  30.             if (!$postData$postData $event->getRequest()->attributes->all();
  31.             //过滤屏蔽数据 先写死
  32.             foreach ($postData as $k => $v) {
  33.                 if ($k == 'password'$postData[$k] = '****';
  34.             }
  35.             $entityClass    $controller[0]::getEntityClass();
  36.             if (($postData['id'] ?? null) && $entityClass) {
  37.                 $rawData $this->entityManager->getRepository($entityClass)->createQueryBuilder('u')
  38.                     ->andWhere('u.id = :id')->setParameter('id'$postData['id'])
  39.                     ->setMaxResults(1)->getQuery()->getOneOrNullResult(AbstractQuery::HYDRATE_ARRAY)
  40.                 ;
  41.             }
  42.             $event->getRequest()->attributes->set('requestData', [
  43.                 'rawData'       => $rawData ?? [],      //原始数据
  44.                 'postData'      => $postData,           //提交的数据
  45.                 'entityClass'   => $entityClass,        //entity
  46.                 'actionLog'     => true,                //是否记录
  47.             ]);
  48.         } catch (\Throwable $e) {
  49.             
  50.         }
  51.     }
  52.     public function onKernelResponse(ResponseEvent $event)
  53.     {
  54.         try {
  55.             //记录当前请求及返回信息
  56.             $request $event->getRequest();
  57.             $requestData $request->attributes->get('requestData');
  58.            
  59.             if ($requestData['actionLog'] ?? false) {  
  60.                 $resp json_decode($event->getResponse()->getContent(), true);
  61.                 $route $this->entityManager->getRepository(AdminAction::class)->findOneBy(['routerName'=>$request->attributes->get('_route')]);
  62.                 $adminLog = new AdminLog();
  63.                 $adminLog->setAdmin($this->security->getUser());
  64.                 $adminLog->setRequestUri($request->getRequestUri());
  65.                 $adminLog->setMethod($request->getMethod());
  66.                 $adminLog->setRoute($request->attributes->get('_route'));
  67.                 $adminLog->setRouteName($route->getName());
  68.                 $adminLog->setController($request->attributes->get('_controller'));
  69.                 $adminLog->setRawData($requestData['rawData']);
  70.                 $adminLog->setPostData($requestData['postData']);
  71.                 $adminLog->setRespCode($resp['code'] ?? 0);
  72.                 $adminLog->setRespMessage($resp['message'] ?? 'success');
  73.                 $adminLog->setIp($request->getClientIp()); //此处是因为使用了nginx的代理 所以这儿获取的nginx proxy的设置
  74.                 
  75.                 $this->entityManager->persist($adminLog);
  76.                 $this->entityManager->flush();
  77.             }
  78.         } catch (\Throwable $e) {
  79.             dd($e->getMessage());
  80.         }
  81.     }
  82.     public static function getSubscribedEvents(): array
  83.     {
  84.         return [
  85.             KernelEvents::CONTROLLER => 'onKernelController',
  86.             KernelEvents::RESPONSE => 'onKernelResponse',
  87.         ];
  88.     }
  89. }