From df0504f1762ba2bddfb7d954a4e8d00d8981a11c Mon Sep 17 00:00:00 2001 From: Andrey Savchenko Date: Thu, 27 Dec 2018 16:58:50 +0200 Subject: [PATCH] Added lazy records collector to pass around. --- CHANGELOG.md | 1 + src/Manager/Server_Timing_Manager.php | 14 +++---- src/Manager/Toolbar_Manager.php | 21 ++++++---- src/Provider/Manager_Provider.php | 4 +- src/Provider/Record_Provider.php | 16 +++----- src/Record/Collector/Lazy_Proxy_Collector.php | 38 +++++++++++++++++++ tests/Manager/ToolbarTest.php | 9 +++-- tests/Provider/ManagerTest.php | 4 ++ 8 files changed, 77 insertions(+), 30 deletions(-) create mode 100644 src/Record/Collector/Lazy_Proxy_Collector.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 54c687a..8ad139f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - sidebar tracking - list of callbacks to hook events - Server Timing output for Ajax and REST APIs +- lazy records collector to pass around instead of whole container ### Changed - required PHP version to 7.1 diff --git a/src/Manager/Server_Timing_Manager.php b/src/Manager/Server_Timing_Manager.php index e8703de..8c4db47 100644 --- a/src/Manager/Server_Timing_Manager.php +++ b/src/Manager/Server_Timing_Manager.php @@ -4,6 +4,7 @@ declare( strict_types=1 ); namespace Rarst\Laps\Manager; use Rarst\Laps\Plugin; +use Rarst\Laps\Record\Collector\Record_Collector_Interface; use Rarst\Laps\Record\Record_Interface; /** @@ -11,15 +12,15 @@ use Rarst\Laps\Record\Record_Interface; */ class Server_Timing_Manager { - /** @var Plugin */ - private $laps; + /** @var Record_Collector_Interface */ + private $collector; /** - * @param Plugin $laps Container instance. + * @param Record_Collector_Interface $collector Collector of all records. */ - public function __construct( Plugin $laps ) { + public function __construct( Record_Collector_Interface $collector ) { - $this->laps = $laps; + $this->collector = $collector; add_action( 'admin_init', [ $this, 'send_timing_header' ], PHP_INT_MAX ); add_action( 'rest_pre_serve_request', [ $this, 'send_timing_header' ] ); @@ -50,11 +51,10 @@ class Server_Timing_Manager { return $input; } - $records = $this->laps['records']; $header = ''; /** @var Record_Interface $record */ - foreach ( $records as $record ) { + foreach ( $this->collector->get_records() as $record ) { $duration = $record->get_duration() * 1000; if ( $duration < 1 ) { diff --git a/src/Manager/Toolbar_Manager.php b/src/Manager/Toolbar_Manager.php index 8cf1ded..a7b74c5 100644 --- a/src/Manager/Toolbar_Manager.php +++ b/src/Manager/Toolbar_Manager.php @@ -3,6 +3,8 @@ declare( strict_types=1 ); namespace Rarst\Laps\Manager; +use Mustache_Engine; +use Rarst\Laps\Record\Collector\Record_Collector_Interface; use Rarst\Laps\Record\Iterator\Recursive_Record_Iterator; use Rarst\Laps\Plugin; use Rarst\Laps\Record\Iterator\Timeline_Iterator; @@ -12,15 +14,20 @@ use Rarst\Laps\Record\Iterator\Timeline_Iterator; */ class Toolbar_Manager { - /** @var Plugin $laps */ - protected $laps; + /** @var Record_Collector_Interface $collector */ + protected $collector; + + /** @var Mustache_Engine */ + private $mustache; /** - * @param Plugin $laps Container instance. + * @param Record_Collector_Interface $collector Collector of all records.. + * @param Mustache_Engine $mustache Mustache instance. */ - public function __construct( Plugin $laps ) { + public function __construct( Record_Collector_Interface $collector, Mustache_Engine $mustache ) { - $this->laps = $laps; + $this->collector = $collector; + $this->mustache = $mustache; add_action( 'admin_bar_menu', [ $this, 'admin_bar_menu' ], 1000 ); } @@ -49,8 +56,8 @@ class Toolbar_Manager { 'id' => 'laps_output', 'parent' => 'laps', 'meta' => [ // TODO consider doing render lazily, but might not be worth the effort. - 'html' => $this->laps['mustache']->render( 'laps', [ - 'timelines' => new Timeline_Iterator( new Recursive_Record_Iterator( $this->laps['records'] ) ), + 'html' => $this->mustache->render( 'laps', [ + 'timelines' => new Timeline_Iterator( new Recursive_Record_Iterator( $this->collector->get_records() ) ), ] ), ], ] ); diff --git a/src/Provider/Manager_Provider.php b/src/Provider/Manager_Provider.php index ac5760f..1876725 100644 --- a/src/Provider/Manager_Provider.php +++ b/src/Provider/Manager_Provider.php @@ -25,8 +25,8 @@ class Manager_Provider implements ServiceProviderInterface, Bootable_Provider_In return [ new Load_Order_Manager(), new Asset_Manager(), - new Toolbar_Manager( $laps ), - new Server_Timing_Manager( $laps ), + new Toolbar_Manager( $laps['records.lazy'], $laps['mustache'] ), + new Server_Timing_Manager( $laps['records.lazy'] ), ]; }; } diff --git a/src/Provider/Record_Provider.php b/src/Provider/Record_Provider.php index e72a37a..259ac20 100644 --- a/src/Provider/Record_Provider.php +++ b/src/Provider/Record_Provider.php @@ -9,7 +9,7 @@ use Rarst\Laps\Plugin; use Rarst\Laps\Record\Collector\Core_Load_Collector; use Rarst\Laps\Record\Collector\Hook_Collector; use Rarst\Laps\Record\Collector\Http_Collector; -use Rarst\Laps\Record\Collector\Record_Collector_Interface; +use Rarst\Laps\Record\Collector\Lazy_Proxy_Collector; use Rarst\Laps\Record\Collector\Sql_Collector; use Symfony\Component\Stopwatch\Stopwatch; @@ -36,16 +36,12 @@ class Record_Provider implements ServiceProviderInterface, Bootable_Provider_Int ]; }; + $pimple['records.lazy'] = function ( Plugin $laps ): Lazy_Proxy_Collector { + return new Lazy_Proxy_Collector( $laps['collectors'] ); + }; + $pimple['records'] = function ( Plugin $laps ): array { - - $records = []; - - /** @var Record_Collector_Interface $collector */ - foreach ( $laps['collectors'] as $collector ) { - $records[] = $collector->get_records(); - } - - return array_merge( ...$records ); + return $laps['records.lazy']->get_records(); }; } diff --git a/src/Record/Collector/Lazy_Proxy_Collector.php b/src/Record/Collector/Lazy_Proxy_Collector.php new file mode 100644 index 0000000..e7144e1 --- /dev/null +++ b/src/Record/Collector/Lazy_Proxy_Collector.php @@ -0,0 +1,38 @@ +collectors = $collectors; + } + + /** + * @return Record_Interface[] + */ + public function get_records(): array { + $records = []; + + /** @var Record_Collector_Interface $collector */ + foreach ( $this->collectors as $collector ) { + $records[] = $collector->get_records(); + } + + return count( $records ) ? array_merge( ...$records ) : []; + } +} diff --git a/tests/Manager/ToolbarTest.php b/tests/Manager/ToolbarTest.php index 2f127f0..1c6c508 100644 --- a/tests/Manager/ToolbarTest.php +++ b/tests/Manager/ToolbarTest.php @@ -1,14 +1,15 @@ [] ] ); - $manager = new Toolbar_Manager( $laps ); + $collector = new Lazy_Proxy_Collector( [] ); + $manager = new Toolbar_Manager( $collector, new \Mustache_Engine() ); $this->assertTrue( has_action( 'admin_bar_menu', [ $manager, 'admin_bar_menu' ] ) ); diff --git a/tests/Provider/ManagerTest.php b/tests/Provider/ManagerTest.php index 98e09fe..bda22d2 100644 --- a/tests/Provider/ManagerTest.php +++ b/tests/Provider/ManagerTest.php @@ -1,7 +1,9 @@ zeroOrMoreTimes()->andReturnFirstArg(); + $container = new Plugin(); $provider = new Manager_Provider();