Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ObjectManagerFactory.php
Go to the documentation of this file.
1 <?php
6 namespace Magento\Framework\App;
7 
14 
25 {
29  const INIT_PARAM_DEPLOYMENT_CONFIG_FILE = 'MAGE_CONFIG_FILE';
30 
34  const INIT_PARAM_DEPLOYMENT_CONFIG = 'MAGE_CONFIG';
35 
41  protected $_locatorClassName = \Magento\Framework\App\ObjectManager::class;
42 
48  protected $_configClassName = \Magento\Framework\Interception\ObjectManager\ConfigInterface::class;
49 
55  protected $envFactoryClassName = \Magento\Framework\App\EnvironmentFactory::class;
56 
62  protected $directoryList;
63 
69  protected $driverPool;
70 
76  protected $configFilePool;
77 
83  protected $factory;
84 
93  {
94  $this->directoryList = $directoryList;
95  $this->driverPool = $driverPool;
96  $this->configFilePool = $configFilePool;
97  }
98 
107  public function create(array $arguments)
108  {
109  $writeFactory = new \Magento\Framework\Filesystem\Directory\WriteFactory($this->driverPool);
110  $generatedFiles = new GeneratedFiles($this->directoryList, $writeFactory);
111  $generatedFiles->cleanGeneratedFiles();
112 
113  $deploymentConfig = $this->createDeploymentConfig($this->directoryList, $this->configFilePool, $arguments);
114  $arguments = array_merge($deploymentConfig->get(), $arguments);
115  $definitionFactory = new \Magento\Framework\ObjectManager\DefinitionFactory(
116  $this->driverPool->getDriver(DriverPool::FILE),
117  $this->directoryList->getPath(DirectoryList::GENERATED_CODE)
118  );
119 
120  $definitions = $definitionFactory->createClassDefinition();
121  $relations = $definitionFactory->createRelations();
122 
124  $envFactory = new $this->envFactoryClassName($relations, $definitions);
126  $env = $envFactory->createEnvironment();
127 
129  $diConfig = $env->getDiConfig();
130 
132  $booleanUtils = new \Magento\Framework\Stdlib\BooleanUtils();
133  $argInterpreter = $this->createArgumentInterpreter($booleanUtils);
134  $argumentMapper = new \Magento\Framework\ObjectManager\Config\Mapper\Dom($argInterpreter);
135 
136  if ($env->getMode() != Environment\Compiled::MODE) {
137  $configData = $this->_loadPrimaryConfig($this->directoryList, $this->driverPool, $argumentMapper, $appMode);
138  if ($configData) {
139  $diConfig->extend($configData);
140  }
141  }
142 
143  // set cache profiler decorator if enabled
144  if (\Magento\Framework\Profiler::isEnabled()) {
145  $cacheFactoryArguments = $diConfig->getArguments(\Magento\Framework\App\Cache\Frontend\Factory::class);
146  $cacheFactoryArguments['decorators'][] = [
147  'class' => \Magento\Framework\Cache\Frontend\Decorator\Profiler::class,
148  'parameters' => ['backendPrefixes' => ['Zend_Cache_Backend_', 'Cm_Cache_Backend_']],
149  ];
150  $cacheFactoryConfig = [
151  \Magento\Framework\App\Cache\Frontend\Factory::class => ['arguments' => $cacheFactoryArguments]
152  ];
153  $diConfig->extend($cacheFactoryConfig);
154  }
155 
156  $sharedInstances = [
157  \Magento\Framework\App\DeploymentConfig::class => $deploymentConfig,
158  \Magento\Framework\App\Filesystem\DirectoryList::class => $this->directoryList,
159  \Magento\Framework\Filesystem\DirectoryList::class => $this->directoryList,
160  \Magento\Framework\Filesystem\DriverPool::class => $this->driverPool,
161  \Magento\Framework\ObjectManager\RelationsInterface::class => $relations,
162  \Magento\Framework\Interception\DefinitionInterface::class => $definitionFactory->createPluginDefinition(),
163  \Magento\Framework\ObjectManager\ConfigInterface::class => $diConfig,
164  \Magento\Framework\Interception\ObjectManager\ConfigInterface::class => $diConfig,
165  \Magento\Framework\ObjectManager\DefinitionInterface::class => $definitions,
166  \Magento\Framework\Stdlib\BooleanUtils::class => $booleanUtils,
167  \Magento\Framework\ObjectManager\Config\Mapper\Dom::class => $argumentMapper,
168  \Magento\Framework\ObjectManager\ConfigLoaderInterface::class => $env->getObjectManagerConfigLoader(),
169  $this->_configClassName => $diConfig,
170  ];
171  $arguments['shared_instances'] = &$sharedInstances;
172  $this->factory = $env->getObjectManagerFactory($arguments);
173 
175  $objectManager = new $this->_locatorClassName($this->factory, $diConfig, $sharedInstances);
176 
177  $this->factory->setObjectManager($objectManager);
178 
179  $generatorParams = $diConfig->getArguments(\Magento\Framework\Code\Generator::class);
181  $generatedEntities = isset($generatorParams['generatedEntities']['_v_'])
182  ? $generatorParams['generatedEntities']['_v_']
183  : (isset($generatorParams['generatedEntities']) ? $generatorParams['generatedEntities'] : []);
184  $definitionFactory->getCodeGenerator()
185  ->setObjectManager($objectManager)
186  ->setGeneratedEntities($generatedEntities);
187 
188  $env->configureObjectManager($diConfig, $sharedInstances);
189 
190  return $objectManager;
191  }
192 
201  protected function createDeploymentConfig(
204  array $arguments
205  ) {
206  $customFile = isset($arguments[self::INIT_PARAM_DEPLOYMENT_CONFIG_FILE])
208  : null;
209  $customData = isset($arguments[self::INIT_PARAM_DEPLOYMENT_CONFIG])
211  : [];
212  $reader = new DeploymentConfig\Reader($directoryList, $this->driverPool, $configFilePool, $customFile);
213  return new DeploymentConfig($reader, $customData);
214  }
215 
222  protected function createArgumentInterpreter(
223  \Magento\Framework\Stdlib\BooleanUtils $booleanUtils
224  ) {
225  $constInterpreter = new \Magento\Framework\Data\Argument\Interpreter\Constant();
226  $result = new \Magento\Framework\Data\Argument\Interpreter\Composite(
227  [
228  'boolean' => new \Magento\Framework\Data\Argument\Interpreter\Boolean($booleanUtils),
229  'string' => new \Magento\Framework\Data\Argument\Interpreter\BaseStringUtils($booleanUtils),
230  'number' => new \Magento\Framework\Data\Argument\Interpreter\Number(),
231  'null' => new \Magento\Framework\Data\Argument\Interpreter\NullType(),
232  'object' => new \Magento\Framework\Data\Argument\Interpreter\DataObject($booleanUtils),
233  'const' => $constInterpreter,
234  'init_parameter' => new \Magento\Framework\App\Arguments\ArgumentInterpreter($constInterpreter),
235  ],
236  \Magento\Framework\ObjectManager\Config\Reader\Dom::TYPE_ATTRIBUTE
237  );
238  // Add interpreters that reference the composite
239  $result->addInterpreter('array', new \Magento\Framework\Data\Argument\Interpreter\ArrayType($result));
240  return $result;
241  }
242 
253  protected function _loadPrimaryConfig(DirectoryList $directoryList, $driverPool, $argumentMapper, $appMode)
254  {
255  $configData = null;
256  try {
257  $fileResolver = new \Magento\Framework\App\Arguments\FileResolver\Primary(
258  new \Magento\Framework\Filesystem(
260  new \Magento\Framework\Filesystem\Directory\ReadFactory($driverPool),
261  new \Magento\Framework\Filesystem\Directory\WriteFactory($driverPool)
262  ),
263  new \Magento\Framework\Config\FileIteratorFactory(
265  )
266  );
267  $schemaLocator = new \Magento\Framework\ObjectManager\Config\SchemaLocator();
268  $validationState = new \Magento\Framework\App\Arguments\ValidationState($appMode);
269 
270  $reader = new \Magento\Framework\ObjectManager\Config\Reader\Dom(
271  $fileResolver,
272  $argumentMapper,
273  $schemaLocator,
274  $validationState
275  );
276  $configData = $reader->read('primary');
277  } catch (\Exception $e) {
278  throw new \Magento\Framework\Exception\State\InitException(
279  new \Magento\Framework\Phrase($e->getMessage()),
280  $e
281  );
282  }
283  return $configData;
284  }
285 
298  protected function _createPluginList(
300  \Magento\Framework\ObjectManager\RelationsInterface $relations,
301  \Magento\Framework\ObjectManager\DefinitionFactory $definitionFactory,
302  \Magento\Framework\ObjectManager\Config\Config $diConfig,
303  \Magento\Framework\ObjectManager\DefinitionInterface $definitions
304  ) {
305  return $objectManager->create(
306  \Magento\Framework\Interception\PluginList\PluginList::class,
307  [
308  'relations' => $relations,
309  'definitions' => $definitionFactory->createPluginDefinition(),
310  'omConfig' => $diConfig,
311  'classDefinitions' => null
312  ]
313  );
314  }
315 }
$objectManager
Definition: bootstrap.php:17
_createPluginList(\Magento\Framework\ObjectManagerInterface $objectManager, \Magento\Framework\ObjectManager\RelationsInterface $relations, \Magento\Framework\ObjectManager\DefinitionFactory $definitionFactory, \Magento\Framework\ObjectManager\Config\Config $diConfig, \Magento\Framework\ObjectManager\DefinitionInterface $definitions)
$deploymentConfig
_loadPrimaryConfig(DirectoryList $directoryList, $driverPool, $argumentMapper, $appMode)
$arguments
createArgumentInterpreter(\Magento\Framework\Stdlib\BooleanUtils $booleanUtils)
__construct(DirectoryList $directoryList, DriverPool $driverPool, ConfigFilePool $configFilePool)
createDeploymentConfig(DirectoryList $directoryList, ConfigFilePool $configFilePool, array $arguments)