123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\ObjectManager\Factory;
- class Compiled extends AbstractFactory
- {
- /**
- * Object manager config
- *
- * @var \Magento\Framework\ObjectManager\ConfigInterface
- */
- protected $config;
- /**
- * Global arguments
- *
- * @var array
- */
- protected $globalArguments;
- /**
- * @var array
- */
- private $sharedInstances;
- /**
- * @param \Magento\Framework\ObjectManager\ConfigInterface $config
- * @param array $sharedInstances
- * @param array $globalArguments
- */
- public function __construct(
- \Magento\Framework\ObjectManager\ConfigInterface $config,
- &$sharedInstances = [],
- $globalArguments = []
- ) {
- $this->config = $config;
- $this->globalArguments = $globalArguments;
- $this->sharedInstances = &$sharedInstances;
- }
- /**
- * Create instance with call time arguments
- *
- * @param string $requestedType
- * @param array $arguments
- * @return object
- * @throws \Exception
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- */
- public function create($requestedType, array $arguments = [])
- {
- $args = $this->config->getArguments($requestedType);
- $type = $this->config->getInstanceType($requestedType);
- if ($args === []) {
- // Case 1: no arguments required
- return new $type();
- } elseif ($args !== null) {
- /**
- * Case 2: arguments retrieved from pre-compiled DI cache
- *
- * Argument key meanings:
- *
- * _i_: shared instance of a class or interface
- * _ins_: non-shared instance of a class or interface
- * _v_: non-array literal value
- * _vac_: array, may be nested and contain other types of keys listed here (objects, array, nulls, etc)
- * _vn_: null value
- * _a_: value to be taken from named environment variable
- * _d_: default value in case environment variable specified by _a_ does not exist
- */
- foreach ($args as $key => &$argument) {
- if (isset($arguments[$key])) {
- $argument = $arguments[$key];
- } elseif (isset($argument['_i_'])) {
- $argument = $this->get($argument['_i_']);
- } elseif (isset($argument['_ins_'])) {
- $argument = $this->create($argument['_ins_']);
- } elseif (isset($argument['_v_'])) {
- $argument = $argument['_v_'];
- } elseif (isset($argument['_vac_'])) {
- $argument = $argument['_vac_'];
- $this->parseArray($argument);
- } elseif (isset($argument['_vn_'])) {
- $argument = null;
- } elseif (isset($argument['_a_'])) {
- if (isset($this->globalArguments[$argument['_a_']])) {
- $argument = $this->globalArguments[$argument['_a_']];
- } else {
- $argument = $argument['_d_'];
- }
- }
- }
- $args = array_values($args);
- } else {
- // Case 3: arguments retrieved in runtime
- $parameters = $this->getDefinitions()->getParameters($type) ?: [];
- $args = $this->resolveArgumentsInRuntime(
- $type,
- $parameters,
- $arguments
- );
- }
- return $this->createObject($type, $args);
- }
- /**
- * Parse array argument
- *
- * @param array $array
- *
- * @return void
- *
- * @SuppressWarnings(PHPMD.UnusedLocalVariable)
- */
- protected function parseArray(&$array)
- {
- foreach ($array as $key => &$argument) {
- if ($argument === (array)$argument) {
- if (isset($argument['_i_'])) {
- $argument = $this->get($argument['_i_']);
- } elseif (isset($argument['_ins_'])) {
- $argument = $this->create($argument['_ins_']);
- } elseif (isset($argument['_a_'])) {
- if (isset($this->globalArguments[$argument['_a_']])) {
- $argument = $this->globalArguments[$argument['_a_']];
- } else {
- $argument = $argument['_d_'];
- }
- } else {
- $this->parseArray($argument);
- }
- }
- }
- }
- /**
- * Retrieve cached object instance
- *
- * @param string $type
- * @return mixed
- */
- protected function get($type)
- {
- if (!isset($this->sharedInstances[$type])) {
- $this->sharedInstances[$type] = $this->create($type);
- }
- return $this->sharedInstances[$type];
- }
- }
|