diff --git a/composer.json b/composer.json index 64a6fe7e19..1ea61eafb9 100644 --- a/composer.json +++ b/composer.json @@ -49,6 +49,7 @@ "brain/monkey": "^2.0", "coenjacobs/mozart": "^0.7", "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "friendsofphp/proxy-manager-lts": "^1.0", "league/container": "^3.3", "mikey179/vfsstream": "1.6.11", "mnsami/composer-custom-directory-installer": "^2.0", @@ -62,6 +63,7 @@ "woocommerce/action-scheduler": "^3.4", "wp-coding-standards/wpcs": "^3", "wp-media/background-processing": "^1.3", + "wp-media/monolog": "^0.0", "wp-media/phpunit": "^3", "wp-media/rocket-lazyload-common": "^3.0.11", "wp-media/wp-imagify-partner": "^1.0", @@ -72,8 +74,7 @@ "wpackagist-plugin/simple-custom-css": "^4.0.3", "wpackagist-plugin/spinupwp": "^1.1", "wpackagist-plugin/woocommerce": "^7", - "wpackagist-plugin/wp-smushit": "^3", - "wp-media/monolog": "^0.0" + "wpackagist-plugin/wp-smushit": "^3" }, "autoload": { "classmap": [ diff --git a/inc/Dependencies/League/Container/Container.php b/inc/Dependencies/League/Container/Container.php index 2dd1f5a042..e178df38f2 100644 --- a/inc/Dependencies/League/Container/Container.php +++ b/inc/Dependencies/League/Container/Container.php @@ -151,10 +151,11 @@ public function addServiceProvider($provider) : self /** * {@inheritdoc} */ - public function get($id, bool $new = false) + public function get($id, bool $new = false, bool $lazy = false) { + //error_log( 'ASA Get: ' . $id ); if ($this->definitions->has($id)) { - $resolved = $this->definitions->resolve($id, $new); + $resolved = $this->definitions->resolve($id, $new, $lazy); return $this->inflectors->inflect($resolved); } diff --git a/inc/Dependencies/League/Container/Definition/Definition.php b/inc/Dependencies/League/Container/Definition/Definition.php index 09cdeef8f0..c53e40cfbe 100644 --- a/inc/Dependencies/League/Container/Definition/Definition.php +++ b/inc/Dependencies/League/Container/Definition/Definition.php @@ -186,7 +186,7 @@ public function addMethodCalls(array $methods = []) : DefinitionInterface /** * {@inheritdoc} */ - public function resolve(bool $new = false) + public function resolve(bool $new = false, bool $lazy = false) { $concrete = $this->concrete; @@ -209,7 +209,7 @@ public function resolve(bool $new = false) } if (is_string($concrete) && class_exists($concrete)) { - $concrete = $this->resolveClass($concrete); + $concrete = $this->resolveClass($concrete, $lazy); } if (is_object($concrete)) { @@ -248,14 +248,39 @@ protected function resolveCallable(callable $concrete) * * @throws ReflectionException */ - protected function resolveClass(string $concrete) + protected function resolveClass(string $concrete, bool $lazy = false) { + //error_log($concrete); $resolved = $this->resolveArguments($this->arguments); - $reflection = new ReflectionClass($concrete); + if ( ! $lazy ) { + return $this->createInstance($concrete, $resolved); + } - return $reflection->newInstanceArgs($resolved); + // for lazyload + return $this->createProxy( $concrete, $resolved ); } + private function createInstance( $concrete, $resolved ) + { + $reflection = new ReflectionClass($concrete); + + return $reflection->newInstanceArgs($resolved); + } + + private function createProxy( $concrete, $resolved ) + { + $factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory(); + return $factory->createProxy( + $concrete, + function (& $wrappedObject, $proxy, $method, $params, & $initializer) use ($concrete, $resolved) { + $wrappedObject = $this->createInstance($concrete, $resolved); + $initializer = null; // turning off further lazy initialization + + return true; + } + ); + } + /** * Invoke methods on resolved instance. * diff --git a/inc/Dependencies/League/Container/Definition/DefinitionAggregate.php b/inc/Dependencies/League/Container/Definition/DefinitionAggregate.php index a3094a19be..0474ed29eb 100644 --- a/inc/Dependencies/League/Container/Definition/DefinitionAggregate.php +++ b/inc/Dependencies/League/Container/Definition/DefinitionAggregate.php @@ -89,9 +89,10 @@ public function getDefinition(string $id) : DefinitionInterface /** * {@inheritdoc} */ - public function resolve(string $id, bool $new = false) + public function resolve(string $id, bool $new = false, bool $lazy = false) { - return $this->getDefinition($id)->resolve($new); + //error_log( var_export( gettype( $this->getDefinition($id) ), true ) ); + return $this->getDefinition($id)->resolve($new, $lazy); } /** diff --git a/inc/Engine/TestLazyload/ServiceProvider.php b/inc/Engine/TestLazyload/ServiceProvider.php new file mode 100644 index 0000000000..9fba2e0dd6 --- /dev/null +++ b/inc/Engine/TestLazyload/ServiceProvider.php @@ -0,0 +1,38 @@ +getContainer() + ->share( 'test_lazyload_class', TestClass::class ); + + $this->getContainer() + ->share( 'test_lazyload_subscriber', Subscriber::class ) + ->addArgument( $this->getContainer()->get( 'test_lazyload_class', true, true ) ); + + + } +} diff --git a/inc/Engine/TestLazyload/Subscriber.php b/inc/Engine/TestLazyload/Subscriber.php new file mode 100644 index 0000000000..d4f4427b14 --- /dev/null +++ b/inc/Engine/TestLazyload/Subscriber.php @@ -0,0 +1,25 @@ +test_class = $test_class; + } + + public static function get_subscribed_events() { + return [ + 'admin_init' => 'log_message', + ]; + } + + public function log_message() + { + $this->test_class->test1(); + } + +} diff --git a/inc/Engine/TestLazyload/TestClass.php b/inc/Engine/TestLazyload/TestClass.php new file mode 100644 index 0000000000..51b0397d48 --- /dev/null +++ b/inc/Engine/TestLazyload/TestClass.php @@ -0,0 +1,18 @@ +container->addServiceProvider( APIServiceProvider::class ); $this->container->addServiceProvider( CommmonExtractCSSServiceProvider::class ); $this->container->addServiceProvider( LazyloadCSSServiceProvider::class ); + $this->container->addServiceProvider( \WP_Rocket\Engine\TestLazyload\ServiceProvider::class ); $common_subscribers = [ 'license_subscriber', @@ -382,6 +383,7 @@ private function init_common_subscribers() { 'shoptimizer', 'weglot', 'contactform7', + 'test_lazyload_subscriber', ]; $host_type = HostResolver::get_host_service();