From d1a3e120a15c4117979a87179e55c703c5213410 Mon Sep 17 00:00:00 2001 From: Grass Huang Date: Fri, 3 Sep 2021 14:37:41 +0800 Subject: [PATCH 1/4] Using virtual type to configure plugin, interceptor method cannot be generated correctly in setup:di:compile command --- .../InterceptionConfigurationBuilder.php | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php b/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php index 61fdf582f2c9b..786218cf888b3 100644 --- a/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php +++ b/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php @@ -13,6 +13,7 @@ use Magento\Framework\Interception\Config\Config as InterceptionConfig; use Magento\Setup\Module\Di\Code\Reader\Type; use Magento\Framework\ObjectManager\InterceptableValidator; +use Magento\Framework\Interception\ObjectManager\ConfigInterface; class InterceptionConfigurationBuilder { @@ -49,24 +50,32 @@ class InterceptionConfigurationBuilder private $interceptableValidator; /** - * @param InterceptionConfig $interceptionConfig - * @param PluginList $pluginList - * @param Type $typeReader - * @param Manager $cacheManager + * @var ConfigInterface + */ + private $omConfig; + + /** + * @param InterceptionConfig $interceptionConfig + * @param PluginList $pluginList + * @param Type $typeReader + * @param Manager $cacheManager * @param InterceptableValidator $interceptableValidator + * @param ConfigInterface $omConfig */ public function __construct( InterceptionConfig $interceptionConfig, PluginList $pluginList, Type $typeReader, Manager $cacheManager, - InterceptableValidator $interceptableValidator + InterceptableValidator $interceptableValidator, + ConfigInterface $omConfig ) { $this->interceptionConfig = $interceptionConfig; $this->pluginList = $pluginList; $this->typeReader = $typeReader; $this->cacheManager = $cacheManager; $this->interceptableValidator = $interceptableValidator; + $this->omConfig = $omConfig; } /** @@ -201,6 +210,11 @@ private function getInterceptedMethods($interceptionConfiguration) foreach ($interceptionConfiguration as &$plugins) { $pluginsMethods = []; foreach ($plugins as $plugin) { + $realPlugin = $this->omConfig->getOriginalInstanceType($plugin); + if ($realPlugin != $plugin) { + $plugin = $realPlugin; + } + $pluginsMethods = array_unique( array_merge($pluginsMethods, array_keys($pluginDefinitionList->getMethodList($plugin))) ); From 5828708e329daa79dad2d1e856508c3112621119 Mon Sep 17 00:00:00 2001 From: Grass Huang Date: Fri, 3 Sep 2021 16:16:15 +0800 Subject: [PATCH 2/4] Update setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php Co-authored-by: Ihor Sviziev --- .../Di/Code/Generator/InterceptionConfigurationBuilder.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php b/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php index 786218cf888b3..4916d8f38b142 100644 --- a/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php +++ b/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php @@ -210,10 +210,7 @@ private function getInterceptedMethods($interceptionConfiguration) foreach ($interceptionConfiguration as &$plugins) { $pluginsMethods = []; foreach ($plugins as $plugin) { - $realPlugin = $this->omConfig->getOriginalInstanceType($plugin); - if ($realPlugin != $plugin) { - $plugin = $realPlugin; - } + $plugin = $this->omConfig->getOriginalInstanceType($plugin); $pluginsMethods = array_unique( array_merge($pluginsMethods, array_keys($pluginDefinitionList->getMethodList($plugin))) From adc20b4a12ddbf9ae0379e9dcce36a57f2bb6440 Mon Sep 17 00:00:00 2001 From: Grass Huang Date: Mon, 6 Sep 2021 09:55:11 +0800 Subject: [PATCH 3/4] Added tests for #33981 (https://github.com/magento/magento2/issues/33980) --- .../InterceptionConfigurationBuilderTest.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Generator/InterceptionConfigurationBuilderTest.php b/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Generator/InterceptionConfigurationBuilderTest.php index 6e61ea17344a4..801eda083113b 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Generator/InterceptionConfigurationBuilderTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Generator/InterceptionConfigurationBuilderTest.php @@ -16,6 +16,7 @@ use Magento\Setup\Module\Di\Code\Reader\Type; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; +use Magento\Framework\Interception\ObjectManager\ConfigInterface; class InterceptionConfigurationBuilderTest extends TestCase { @@ -49,6 +50,11 @@ class InterceptionConfigurationBuilderTest extends TestCase */ private $interceptableValidator; + /** + * @var MockObject + */ + private $omConfig; + protected function setUp(): void { $this->interceptionConfig = @@ -60,6 +66,7 @@ protected function setUp(): void $this->cacheManager = $this->createMock(Manager::class); $this->interceptableValidator = $this->createMock(InterceptableValidator::class); + $this->omConfig = $this->createMock(ConfigInterface::class); $this->typeReader = $this->createPartialMock(Type::class, ['isConcrete']); $this->model = new InterceptionConfigurationBuilder( @@ -67,7 +74,8 @@ protected function setUp(): void $this->pluginList, $this->typeReader, $this->cacheManager, - $this->interceptableValidator + $this->interceptableValidator, + $this->omConfig ); } @@ -105,6 +113,13 @@ public function testGetInterceptionConfiguration($plugins) ->method('getPluginsConfig') ->willReturn(['instance' => $plugins]); + $this->omConfig->expects($this->any()) + ->method('getOriginalInstanceType') + ->willReturnMap([ + ['someinstance', 'someinstance'], + ['someinstance1', 'someinstance'], + ]); + $this->model->addAreaCode('areaCode'); $this->model->getInterceptionConfiguration($definedClasses); } @@ -117,6 +132,7 @@ public function getInterceptionConfigurationDataProvider() return [ [null], [['plugin' => ['instance' => 'someinstance']]], + [['plugin' => ['instance' => 'someinstance1']]], [['plugin' => ['instance' => 'someinstance'], 'plugin2' => ['instance' => 'someinstance']]] ]; } From 7ad5055e68f8bc22234a1f69772e4bda428790b4 Mon Sep 17 00:00:00 2001 From: Ihor Sviziev Date: Tue, 7 Sep 2021 14:06:25 +0300 Subject: [PATCH 4/4] Using virtual type to configure plugin, interceptor method cannot be generated correctly in setup:di:compile command 1. Make changes in constructor backward compatible 2. Fix static tests - extract to separate method - replace array_merge in loop with a single array_merge --- .../InterceptionConfigurationBuilder.php | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php b/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php index 4916d8f38b142..fb88bee68c82f 100644 --- a/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php +++ b/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php @@ -10,10 +10,12 @@ use Magento\Framework\App\Area; use Magento\Framework\App\Cache\Manager; use Magento\Framework\App\Interception\Cache\CompiledConfig; +use Magento\Framework\App\ObjectManager; use Magento\Framework\Interception\Config\Config as InterceptionConfig; -use Magento\Setup\Module\Di\Code\Reader\Type; -use Magento\Framework\ObjectManager\InterceptableValidator; +use Magento\Framework\Interception\Definition\Runtime; use Magento\Framework\Interception\ObjectManager\ConfigInterface; +use Magento\Framework\ObjectManager\InterceptableValidator; +use Magento\Setup\Module\Di\Code\Reader\Type; class InterceptionConfigurationBuilder { @@ -55,12 +57,12 @@ class InterceptionConfigurationBuilder private $omConfig; /** - * @param InterceptionConfig $interceptionConfig - * @param PluginList $pluginList - * @param Type $typeReader - * @param Manager $cacheManager + * @param InterceptionConfig $interceptionConfig + * @param PluginList $pluginList + * @param Type $typeReader + * @param Manager $cacheManager * @param InterceptableValidator $interceptableValidator - * @param ConfigInterface $omConfig + * @param ConfigInterface|null $omConfig */ public function __construct( InterceptionConfig $interceptionConfig, @@ -68,14 +70,14 @@ public function __construct( Type $typeReader, Manager $cacheManager, InterceptableValidator $interceptableValidator, - ConfigInterface $omConfig + ?ConfigInterface $omConfig = null ) { $this->interceptionConfig = $interceptionConfig; $this->pluginList = $pluginList; $this->typeReader = $typeReader; $this->cacheManager = $cacheManager; $this->interceptableValidator = $interceptableValidator; - $this->omConfig = $omConfig; + $this->omConfig = $omConfig ?? ObjectManager::getInstance()->get(ConfigInterface::class); } /** @@ -204,20 +206,23 @@ private function mergeAreaPlugins($inheritedConfig) * @param array $interceptionConfiguration * @return array */ - private function getInterceptedMethods($interceptionConfiguration) + private function getInterceptedMethods(array $interceptionConfiguration): array { - $pluginDefinitionList = new \Magento\Framework\Interception\Definition\Runtime(); + $pluginDefinitionList = new Runtime(); + foreach ($interceptionConfiguration as &$plugins) { $pluginsMethods = []; + foreach ($plugins as $plugin) { $plugin = $this->omConfig->getOriginalInstanceType($plugin); - $pluginsMethods = array_unique( - array_merge($pluginsMethods, array_keys($pluginDefinitionList->getMethodList($plugin))) - ); + $pluginsMethods[] = $pluginDefinitionList->getMethodList($plugin); } - $plugins = $pluginsMethods; + + // phpcs:ignore Magento2.Performance.ForeachArrayMerge + $plugins = array_unique(array_merge([], ...$pluginsMethods)); } + return $interceptionConfiguration; } }