Skip to content
This repository has been archived by the owner on Dec 6, 2022. It is now read-only.

Commit

Permalink
Add code
Browse files Browse the repository at this point in the history
  • Loading branch information
gggeek committed Sep 24, 2014
1 parent 69b1e45 commit e430758
Show file tree
Hide file tree
Showing 7 changed files with 521 additions and 0 deletions.
29 changes: 29 additions & 0 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace GGGeek\eZPerformanceLoggerBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
* This is the class that validates and merges configuration from your app/config files
*
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
*/
class Configuration implements ConfigurationInterface
{
/**
* {@inheritDoc}
*/
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('ezperformancelogger');

// Here you should define the parameters that are allowed to
// configure your bundle. See the documentation linked above for
// more information on that topic.

return $treeBuilder;
}
}
28 changes: 28 additions & 0 deletions DependencyInjection/GGGeekEZPerformanceLoggerExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace GGGeek\eZPerformanceLoggerBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

/**
* This is the class that loads and manages your bundle configuration
*
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
*/
class GGGeekEZPerformanceLoggerExtension extends Extension
{
/**
* {@inheritDoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);

$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
}
}
93 changes: 93 additions & 0 deletions EventListener/PerfLogger.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php
/**
* @author G. Giunta
* @copyright (C) eZ Systems AS 2014
* @license Licensed under GNU General Public License v2.0. See file license.txt
*/

namespace GGGeek\eZPerformanceLoggerBundle\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use eZPerfLogger;

/**
* A class designed to be hooked up as a Symfony Event listener, to execute the logging of perf. counters
*/
class PerfLogger implements EventSubscriberInterface
{
protected $legacyKernelClosure;
protected $hasRun = false;
protected $needsResponseRewrite = false;

/**
* @param callable $legacyKernelClosure
* @param bool $needsResponseRewrite Ideally we should figure this out from ezperformancelogger inis, but it would
* be too complicated, so we allow the developer to tell us
*/
public function __construct( \Closure $legacyKernelClosure, $needsResponseRewrite = false )
{
$this->legacyKernelClosure = $legacyKernelClosure;
$this->needsResponseRewrite = $needsResponseRewrite;
}

/**
* @return array
*/
public static function getSubscribedEvents()
{
return array(
KernelEvents::TERMINATE => 'onTerminate',
KernelEvents::RESPONSE => 'onFilterResponse'
);
}

/**
* If needed, executes the ezperformancelogger logging on the Symfony Post-Response event
* We wrap the logging code in a runCallback call, as it might need to read inis and such stuff
* NB: we do not need to check for request type - this event only fires on master requests
*
* @param $event
*/
public function onTerminate( PostResponseEvent $event )
{
// small speed gain: avoid useless callback if measurement was already done
if ( $this->hasRun )
return;

$response = $event->getResponse();
$legacyKernelClosure = $this->legacyKernelClosure;
$legacyKernel = $legacyKernelClosure();
$legacyKernel->runCallback( function() use ( $response ) {
eZPerfLogger::cleanup( $response->getContent(), $response->getStatusCode() );
} );
$this->hasRun = true;
}

/**
* If needed, executes the ezperformancelogger logging on the Symfony Filter-Response event, so we can modify it
*/
public function onFilterResponse( FilterResponseEvent $event )
{
if ( $event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST )
return;

if ( !$this->needsResponseRewrite )
return;

$response = $event->getResponse();
$legacyKernelClosure = $this->legacyKernelClosure;
$legacyKernel = $legacyKernelClosure();
$legacyKernel->runCallback( function() use ( $response ) {
if ( eZPerfLogger::isEnabled() )
{
$content = eZPerfLogger::preoutput( $response->getContent(), $response->getStatusCode() );
$response->setContent( $content );
}
} );
$this->hasRun = true;
}
}
9 changes: 9 additions & 0 deletions GGGeekEZPerformanceLoggerBundle.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

namespace GGGeek\eZPerformanceLoggerBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class GGGeekEZPerformanceLoggerBundle extends Bundle
{
}
Loading

0 comments on commit e430758

Please sign in to comment.