3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
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 +--------------------------------------------------------------------+
12 namespace Civi\API\Subscriber
;
14 use Symfony\Component\EventDispatcher\EventSubscriberInterface
;
17 * Class XDebugSubscriber
18 * @package Civi\API\Subscriber
20 class DebugSubscriber
implements EventSubscriberInterface
{
23 * @var \Civi\API\LogObserver
32 public function __construct() {
33 $version = phpversion('xdebug');
34 switch ($version ?
substr($version, 0, 2) : NULL) {
36 $this->enableStats
= function_exists('xdebug_time_index');
40 $xdebugMode = explode(',', ini_get('xdebug.mode'));
41 $this->enableStats
= in_array('develop', $xdebugMode);
45 $this->enableStats
= FALSE;
53 public static function getSubscribedEvents() {
55 'civi.api.prepare' => ['onApiPrepare', 999],
56 'civi.api.respond' => ['onApiRespond', -999],
60 public function onApiPrepare(\Civi\API\Event\PrepareEvent
$event) {
61 $apiRequest = $event->getApiRequest();
62 if (!isset($this->debugLog
)
63 && !empty($apiRequest['params']['debug'])
64 && (empty($apiRequest['params']['check_permissions']) || \CRM_Core_Permission
::check('view debug output'))
66 $this->debugLog
= new \Civi\API\
LogObserver();
67 \CRM_Core_Error
::createDebugLogger()->attach($this->debugLog
);
72 * @param \Civi\API\Event\RespondEvent $event
75 public function onApiRespond(\Civi\API\Event\RespondEvent
$event) {
76 $apiRequest = $event->getApiRequest();
77 $result = $event->getResponse();
78 if (!empty($apiRequest['params']['debug'])
79 && (empty($apiRequest['params']['check_permissions']) || \CRM_Core_Permission
::check('view debug output'))
81 if (is_a($result, '\Civi\Api4\Generic\Result')) {
82 $result->debug
= $result->debug ??
[];
83 $debug =& $result->debug
;
85 // result would not be an array for api3 getvalue
86 elseif (is_array($result)) {
87 $result['xdebug'] = $result['xdebug'] ??
[];
88 $debug =& $result['xdebug'];
93 if (isset($this->debugLog
) && $this->debugLog
->getMessages()) {
94 $debug['log'] = $this->debugLog
->getMessages();
96 if ($this->enableStats
) {
97 $debug['peakMemory'] = xdebug_peak_memory_usage();
98 $debug['memory'] = xdebug_memory_usage();
99 $debug['timeIndex'] = xdebug_time_index();
101 $event->setResponse($result);