Skip to content

Commit 307b35d

Browse files
kandyandimov
authored andcommitted
Add 3rd part reset capability
1 parent 03621bb commit 307b35d

File tree

3 files changed

+48
-28
lines changed

3 files changed

+48
-28
lines changed

lib/internal/Magento/Framework/ObjectManager/Resetter/Resetter.php

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
namespace Magento\Framework\ObjectManager\Resetter;
99

1010
use Magento\Framework\App\ObjectManager;
11+
use Magento\Framework\Component\ComponentRegistrar;
12+
use Magento\Framework\Component\ComponentRegistrarInterface;
1113
use Magento\Framework\ObjectManager\ResetAfterRequestInterface;
1214
use Magento\Framework\ObjectManagerInterface;
1315
use WeakMap;
@@ -17,7 +19,8 @@
1719
*/
1820
class Resetter implements ResetterInterface
1921
{
20-
public const RESET_PATH = '/app/etc/reset.php';
22+
public const RESET_PATH = 'reset.json';
23+
private const RESET_STATE_METHOD = '_resetState';
2124

2225
/** @var WeakMap instances to be reset after request */
2326
private WeakMap $resetAfterWeakMap;
@@ -28,21 +31,6 @@ class Resetter implements ResetterInterface
2831
/** @var WeakMapSorter|null Note: We use temporal coupling here because of chicken/egg during bootstrapping */
2932
private ?WeakMapSorter $weakMapSorter = null;
3033

31-
/**
32-
* @var array
33-
*
34-
*/
35-
private array $classList = [
36-
//phpcs:disable Magento2.PHP.LiteralNamespaces
37-
'Magento\Framework\GraphQl\Query\Fields' => true,
38-
'Magento\Store\Model\Store' => [
39-
"_baseUrlCache" => [],
40-
"_configCache" => null,
41-
"_configCacheBaseNodes" => [],
42-
"_dirCache" => [],
43-
"_urlCache" => []
44-
]
45-
];
4634

4735
/**
4836
* @var array
@@ -55,15 +43,34 @@ class Resetter implements ResetterInterface
5543
* @return void
5644
* @phpcs:disable Magento2.Functions.DiscouragedFunction
5745
*/
58-
public function __construct()
59-
{
60-
if (\file_exists(BP . self::RESET_PATH)) {
61-
// phpcs:ignore Magento2.Security.IncludeFile.FoundIncludeFile
62-
$this->classList = array_replace($this->classList, (require BP . self::RESET_PATH));
46+
public function __construct(
47+
private ComponentRegistrarInterface $componentRegistrar,
48+
private array $classList = [],
49+
) {
50+
foreach ($this->getPaths() as $resetPath) {
51+
if (!\file_exists($resetPath)) {
52+
continue;
53+
}
54+
$resetData = \json_decode(\file_get_contents($resetPath), true);
55+
$this->classList = array_replace($this->classList, $resetData);
6356
}
6457
$this->resetAfterWeakMap = new WeakMap;
6558
}
6659

60+
/**
61+
* Get paths for reset json
62+
*
63+
* @return \Generator<string>
64+
*/
65+
private function getPaths(): \Generator
66+
{
67+
yield BP . '/app/etc/' . self::RESET_PATH;
68+
foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $modulePath) {
69+
yield $modulePath . '/etc/' . self::RESET_PATH;
70+
}
71+
}
72+
73+
6774
/**
6875
* Add instance to be reset later
6976
*
@@ -72,7 +79,10 @@ public function __construct()
7279
*/
7380
public function addInstance(object $instance) : void
7481
{
75-
if ($instance instanceof ResetAfterRequestInterface || isset($this->classList[\get_class($instance)])) {
82+
if ($instance instanceof ResetAfterRequestInterface
83+
|| \method_exists($instance, self::RESET_STATE_METHOD)
84+
|| isset($this->classList[\get_class($instance)])
85+
) {
7686
$this->resetAfterWeakMap[$instance] = true;
7787
}
7888
}
@@ -124,6 +134,10 @@ public function setObjectManager(ObjectManagerInterface $objectManager) : void
124134
*/
125135
private function resetStateWithReflection(object $instance)
126136
{
137+
if (\method_exists($instance, self::RESET_STATE_METHOD)) {
138+
$instance->{self::RESET_STATE_METHOD}();
139+
return;
140+
}
127141
$className = \get_class($instance);
128142
$reflectionClass = $this->reflectionCache[$className]
129143
?? $this->reflectionCache[$className] = new \ReflectionClass($className);

lib/internal/Magento/Framework/ObjectManager/Resetter/ResetterFactory.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
namespace Magento\Framework\ObjectManager\Resetter;
99

10+
use Magento\Framework\ObjectManagerInterface;
11+
1012
/**
1113
* Factory that creates Resetter based on environment variable.
1214
*/
@@ -17,15 +19,18 @@ class ResetterFactory
1719
*/
1820
private static string $resetterClassName = Resetter::class;
1921

22+
public function __construct(private ObjectManagerInterface $objectManager)
23+
{
24+
}
25+
2026
/**
21-
* Create resseter factory
27+
* Create resseter instance
2228
*
2329
* @return ResetterInterface
24-
* @phpcs:disable Magento2.Functions.StaticFunction
2530
*/
26-
public static function create() : ResetterInterface
31+
public function create() : ResetterInterface
2732
{
28-
return new static::$resetterClassName;
33+
return $this->objectManager->create(static::$resetterClassName);
2934
}
3035

3136
/**

lib/internal/Magento/Framework/TestFramework/ApplicationStateComparator/Resetter.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace Magento\Framework\TestFramework\ApplicationStateComparator;
99

10+
use Magento\Framework\Component\ComponentRegistrarInterface;
1011
use Magento\Framework\ObjectManager\Resetter\Resetter as OriginalResetter;
1112
use Magento\Framework\ObjectManagerInterface;
1213
use WeakMap;
@@ -37,11 +38,11 @@ class Resetter extends OriginalResetter
3738
* @param array $classList
3839
* @return void
3940
*/
40-
public function __construct()
41+
public function __construct(ComponentRegistrarInterface $componentRegistrar, array $classList = [])
4142
{
4243
$this->collectedWeakMap = new WeakMap;
4344
$this->skipListAndFilterList = new SkipListAndFilterList;
44-
parent::__construct();
45+
parent::__construct($componentRegistrar, $classList);
4546
}
4647

4748
/**

0 commit comments

Comments
 (0)