File: /home/petsclubcc/magento/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\ObjectManager\Factory;
use Magento\Framework\ObjectManagerInterface;
abstract class AbstractFactory implements \Magento\Framework\ObjectManager\FactoryInterface
{
/**
* Object manager
*
* @var ObjectManagerInterface
*/
protected $objectManager;
/**
* Object manager config
*
* @var \Magento\Framework\ObjectManager\ConfigInterface
*/
protected $config;
/**
* Definition list
*
* @var \Magento\Framework\ObjectManager\DefinitionInterface
*/
protected $definitions;
/**
* Global arguments
*
* @var array
*/
protected $globalArguments;
/**
* @param \Magento\Framework\ObjectManager\ConfigInterface $config
* @param ObjectManagerInterface $objectManager
* @param \Magento\Framework\ObjectManager\DefinitionInterface $definitions
* @param array $globalArguments
*/
public function __construct(
\Magento\Framework\ObjectManager\ConfigInterface $config,
ObjectManagerInterface $objectManager = null,
\Magento\Framework\ObjectManager\DefinitionInterface $definitions = null,
$globalArguments = []
) {
$this->config = $config;
$this->objectManager = $objectManager;
$this->definitions = $definitions ?: new \Magento\Framework\ObjectManager\Definition\Runtime();
$this->globalArguments = $globalArguments;
}
/**
* Set object manager
*
* @param ObjectManagerInterface $objectManager
*
* @return void
*/
public function setObjectManager(ObjectManagerInterface $objectManager)
{
$this->objectManager = $objectManager;
}
/**
* Set global arguments
*
* @param array $arguments
*
* @return void
*/
public function setArguments($arguments)
{
$this->globalArguments = $arguments;
}
/**
* Create object
*
* @param string $type
* @param array $args
*
* @return object
*
*/
protected function createObject($type, $args)
{
return new $type(...array_values($args));
}
/**
* Resolve an argument
*
* @param array &$argument
* @param string $paramType
* @param mixed $paramDefault
* @param string $paramName
* @param string $requestedType
*
* @return void
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected function resolveArgument(&$argument, $paramType, $paramDefault, $paramName, $requestedType)
{
if ($paramType && $argument !== $paramDefault && !is_object($argument)) {
$argumentType = $argument['instance'];
if (!isset($argument['instance']) || $argument !== (array)$argument) {
throw new \UnexpectedValueException(
'Invalid parameter configuration provided for $' . $paramName . ' argument of ' . $requestedType
);
}
if (isset($argument['shared'])) {
$isShared = $argument['shared'];
} else {
$isShared = $this->config->isShared($argumentType);
}
if ($isShared) {
$argument = $this->objectManager->get($argumentType);
} else {
$argument = $this->objectManager->create($argumentType);
}
} else if ($argument === (array)$argument) {
if (isset($argument['argument'])) {
if (isset($this->globalArguments[$argument['argument']])) {
$argument = $this->globalArguments[$argument['argument']];
} else {
$argument = $paramDefault;
}
} else if (!empty($argument)) {
$this->parseArray($argument);
}
}
}
/**
* Parse array argument
*
* @param array $array
*
* @return void
*/
protected function parseArray(&$array)
{
foreach ($array as $key => $item) {
if ($item === (array)$item) {
if (isset($item['instance'])) {
if (isset($item['shared'])) {
$isShared = $item['shared'];
} else {
$isShared = $this->config->isShared($item['instance']);
}
if ($isShared) {
$array[$key] = $this->objectManager->get($item['instance']);
} else {
$array[$key] = $this->objectManager->create($item['instance']);
}
} elseif (isset($item['argument'])) {
if (isset($this->globalArguments[$item['argument']])) {
$array[$key] = $this->globalArguments[$item['argument']];
} else {
$array[$key] = null;
}
} else {
$this->parseArray($array[$key]);
}
}
}
}
}