123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <?php
- namespace Drupal\webprofiler\EventSubscriber;
- use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
- use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
- use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
- use Symfony\Component\HttpKernel\KernelEvents;
- use Symfony\Component\HttpKernel\Profiler\Profiler;
- use Symfony\Component\HttpFoundation\RequestMatcherInterface;
- use Symfony\Component\HttpFoundation\RequestStack;
- use Symfony\Component\EventDispatcher\EventSubscriberInterface;
- class ProfilerSubscriber implements EventSubscriberInterface {
- protected $profiler;
- protected $matcher;
- protected $onlyException;
- protected $onlyMasterRequests;
- protected $exception;
- protected $profiles;
- protected $requestStack;
- protected $parents;
- /**
- * @param Profiler $profiler A Profiler instance
- * @param RequestStack $requestStack A RequestStack instance
- * @param RequestMatcherInterface|null $matcher A RequestMatcher instance
- * @param bool $onlyException True if the profiler only collects data when an
- * exception occurs, false otherwise
- * @param bool $onlyMasterRequests True if the profiler only collects data
- * when the request is a master request, false otherwise
- */
- public function __construct(Profiler $profiler, RequestStack $requestStack, RequestMatcherInterface $matcher = NULL, $onlyException = FALSE, $onlyMasterRequests = FALSE) {
- $this->profiler = $profiler;
- $this->matcher = $matcher;
- $this->onlyException = (bool) $onlyException;
- $this->onlyMasterRequests = (bool) $onlyMasterRequests;
- $this->profiles = new \SplObjectStorage();
- $this->parents = new \SplObjectStorage();
- $this->requestStack = $requestStack;
- }
- /**
- * Handles the onKernelException event.
- */
- public function onKernelException(GetResponseForExceptionEvent $event) {
- if ($this->onlyMasterRequests && !$event->isMasterRequest()) {
- return;
- }
- $this->exception = $event->getException();
- }
- /**
- * Handles the onKernelResponse event.
- */
- public function onKernelResponse(FilterResponseEvent $event) {
- $master = $event->isMasterRequest();
- if ($this->onlyMasterRequests && !$master) {
- return;
- }
- if ($this->onlyException && NULL === $this->exception) {
- return;
- }
- $request = $event->getRequest();
- $exception = $this->exception;
- $this->exception = NULL;
- if (NULL !== $this->matcher && !$this->matcher->matches($request)) {
- return;
- }
- if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) {
- return;
- }
- $this->profiles[$request] = $profile;
- $this->parents[$request] = $this->requestStack->getParentRequest();
- }
- public function onKernelFinishRequest(FinishRequestEvent $event) {
- // attach children to parents
- foreach ($this->profiles as $request) {
- if (NULL !== $parentRequest = $this->parents[$request]) {
- if (isset($this->profiles[$parentRequest])) {
- $this->profiles[$parentRequest]->addChild($this->profiles[$request]);
- }
- }
- }
- // save profiles
- foreach ($this->profiles as $request) {
- $this->profiler->saveProfile($this->profiles[$request]);
- }
- $this->profiles = new \SplObjectStorage();
- $this->parents = new \SplObjectStorage();
- }
- public static function getSubscribedEvents() {
- return [
- KernelEvents::RESPONSE => ['onKernelResponse', -100],
- KernelEvents::EXCEPTION => 'onKernelException',
- KernelEvents::FINISH_REQUEST => ['onKernelFinishRequest', -1024],
- ];
- }
- }
|