Merge pull request #17026 from jitendrapurohit/dev-57
[civicrm-core.git] / Civi / API / Subscriber / DebugSubscriber.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
5 | |
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
9 +--------------------------------------------------------------------+
10 */
11
12 namespace Civi\API\Subscriber;
13
14 use Civi\API\Events;
15 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
16
17 /**
18 * Class XDebugSubscriber
19 * @package Civi\API\Subscriber
20 */
21 class DebugSubscriber implements EventSubscriberInterface {
22
23 /**
24 * @var \Civi\API\LogObserver
25 */
26 private $debugLog;
27
28 /**
29 * @return array
30 */
31 public static function getSubscribedEvents() {
32 return [
33 Events::PREPARE => ['onApiPrepare', 999],
34 Events::RESPOND => ['onApiRespond', -999],
35 ];
36 }
37
38 public function onApiPrepare(\Civi\API\Event\PrepareEvent $event) {
39 $apiRequest = $event->getApiRequest();
40 if (!isset($this->debugLog)
41 && !empty($apiRequest['params']['debug'])
42 && (empty($apiRequest['params']['check_permissions']) || \CRM_Core_Permission::check('view debug output'))
43 ) {
44 $this->debugLog = new \Civi\API\LogObserver();
45 \CRM_Core_Error::createDebugLogger()->attach($this->debugLog);
46 }
47 }
48
49 /**
50 * @param \Civi\API\Event\RespondEvent $event
51 * API response event.
52 */
53 public function onApiRespond(\Civi\API\Event\RespondEvent $event) {
54 $apiRequest = $event->getApiRequest();
55 $result = $event->getResponse();
56 if (!empty($apiRequest['params']['debug'])
57 && (empty($apiRequest['params']['check_permissions']) || \CRM_Core_Permission::check('view debug output'))
58 ) {
59 if (is_a($result, '\Civi\Api4\Generic\Result')) {
60 $result->debug = $result->debug ?? [];
61 $debug =& $result->debug;
62 }
63 // result would not be an array for api3 getvalue
64 elseif (is_array($result)) {
65 $result['xdebug'] = $result['xdebug'] ?? [];
66 $debug =& $result['xdebug'];
67 }
68 else {
69 return;
70 }
71 if (isset($this->debugLog) && $this->debugLog->getMessages()) {
72 $debug['log'] = $this->debugLog->getMessages();
73 }
74 if (function_exists('xdebug_time_index')) {
75 $debug['peakMemory'] = xdebug_peak_memory_usage();
76 $debug['memory'] = xdebug_memory_usage();
77 $debug['timeIndex'] = xdebug_time_index();
78 }
79 $event->setResponse($result);
80 }
81 }
82
83 }