132 lines
3.8 KiB
PHP
Executable File
132 lines
3.8 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
namespace Magento\TestFramework;
|
|
|
|
/**
|
|
* ObjectManager for integration test framework.
|
|
*/
|
|
class ObjectManager extends \Magento\Framework\App\ObjectManager
|
|
{
|
|
/**
|
|
* Classes with xml properties to explicitly call __destruct() due to https://bugs.php.net/bug.php?id=62468
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $_classesToDestruct = [
|
|
\Magento\Framework\View\Layout::class,
|
|
\Magento\Framework\Registry::class
|
|
];
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $persistedInstances = [];
|
|
|
|
/**
|
|
* Set list of instances that should be persistent.
|
|
*
|
|
* @param array $persistedInstances
|
|
*/
|
|
public function setPersistedInstances(array $persistedInstances): void
|
|
{
|
|
$this->persistedInstances = $persistedInstances;
|
|
}
|
|
|
|
/**
|
|
* Clear InstanceManager cache.
|
|
*
|
|
* @return \Magento\TestFramework\ObjectManager
|
|
*/
|
|
public function clearCache()
|
|
{
|
|
foreach ($this->_classesToDestruct as $className) {
|
|
if (isset($this->_sharedInstances[$className])) {
|
|
$this->_sharedInstances[$className] = null;
|
|
}
|
|
}
|
|
|
|
\Magento\Framework\App\Config\Base::destroy();
|
|
$sharedInstances = [
|
|
\Magento\Framework\ObjectManagerInterface::class => $this,
|
|
\Magento\Framework\App\ObjectManager::class => $this,
|
|
];
|
|
foreach ($this->persistedInstances as $persistedClass) {
|
|
if (isset($this->_sharedInstances[$persistedClass])) {
|
|
$sharedInstances[$persistedClass] = $this->_sharedInstances[$persistedClass];
|
|
}
|
|
}
|
|
$this->_sharedInstances = $sharedInstances;
|
|
$this->_config->clean();
|
|
$this->clearMappedTableNames();
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Clear mapped table names list.
|
|
*
|
|
* @return void
|
|
*/
|
|
private function clearMappedTableNames()
|
|
{
|
|
$resourceConnection = $this->get(\Magento\Framework\App\ResourceConnection::class);
|
|
if ($resourceConnection) {
|
|
$reflection = new \ReflectionClass($resourceConnection);
|
|
$dataProperty = $reflection->getProperty('mappedTableNames');
|
|
$dataProperty->setAccessible(true);
|
|
$dataProperty->setValue($resourceConnection, null);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add shared instance.
|
|
*
|
|
* @param mixed $instance
|
|
* @param string $className
|
|
* @param bool $forPreference Resolve preference for class
|
|
* @return void
|
|
*/
|
|
public function addSharedInstance($instance, $className, $forPreference = false)
|
|
{
|
|
$className = $forPreference ? $this->_config->getPreference($className) : $className;
|
|
$this->_sharedInstances[$className] = $instance;
|
|
}
|
|
|
|
/**
|
|
* Remove shared instance.
|
|
*
|
|
* @param string $className
|
|
* @param bool $forPreference Resolve preference for class
|
|
* @return void
|
|
*/
|
|
public function removeSharedInstance($className, $forPreference = false)
|
|
{
|
|
$className = $forPreference ? $this->_config->getPreference($className) : $className;
|
|
unset($this->_sharedInstances[$className]);
|
|
}
|
|
|
|
/**
|
|
* Set objectManager.
|
|
*
|
|
* @param \Magento\Framework\ObjectManagerInterface $objectManager
|
|
* @return \Magento\Framework\ObjectManagerInterface
|
|
*/
|
|
public static function setInstance(\Magento\Framework\ObjectManagerInterface $objectManager)
|
|
{
|
|
return self::$_instance = $objectManager;
|
|
}
|
|
|
|
/**
|
|
* Get object factory
|
|
*
|
|
* @return \Magento\Framework\ObjectManager\FactoryInterface|\Magento\Framework\ObjectManager\Factory\Factory
|
|
*/
|
|
public function getFactory()
|
|
{
|
|
return $this->_factory;
|
|
}
|
|
}
|