Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
LazyControllerAbstractFactory.php
Go to the documentation of this file.
1 <?php
9 declare(strict_types=1);
10 
12 
13 use Interop\Container\ContainerInterface;
14 use ReflectionClass;
15 use ReflectionParameter;
16 use Zend\Console\Adapter\AdapterInterface as ConsoleAdapterInterface;
17 use Zend\Filter\FilterPluginManager;
18 use Zend\Hydrator\HydratorPluginManager;
19 use Zend\InputFilter\InputFilterPluginManager;
20 use Zend\Log\FilterPluginManager as LogFilterManager;
21 use Zend\Log\FormatterPluginManager as LogFormatterManager;
22 use Zend\Log\ProcessorPluginManager as LogProcessorManager;
23 use Zend\Log\WriterPluginManager as LogWriterManager;
24 use Zend\Serializer\AdapterPluginManager as SerializerAdapterManager;
25 use Zend\ServiceManager\AbstractFactoryInterface;
26 use Zend\ServiceManager\Exception\ServiceNotFoundException;
27 use Zend\ServiceManager\ServiceLocatorInterface;
28 use Zend\Stdlib\DispatchableInterface;
29 use Zend\Validator\ValidatorPluginManager;
30 
78 class LazyControllerAbstractFactory implements AbstractFactoryInterface
79 {
89  protected $aliases = [
90  ConsoleAdapterInterface::class => 'ConsoleAdapter',
91  FilterPluginManager::class => 'FilterManager',
92  HydratorPluginManager::class => 'HydratorManager',
93  InputFilterPluginManager::class => 'InputFilterManager',
94  LogFilterManager::class => 'LogFilterManager',
95  LogFormatterManager::class => 'LogFormatterManager',
96  LogProcessorManager::class => 'LogProcessorManager',
97  LogWriterManager::class => 'LogWriterManager',
98  SerializerAdapterManager::class => 'SerializerAdapterManager',
99  ValidatorPluginManager::class => 'ValidatorManager',
100  ];
101 
107  public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
108  {
109  $reflectionClass = new ReflectionClass($requestedName);
110 
111  if (null === ($constructor = $reflectionClass->getConstructor())) {
112  return new $requestedName();
113  }
114 
115  $reflectionParameters = $constructor->getParameters();
116 
117  if (empty($reflectionParameters)) {
118  return new $requestedName();
119  }
120 
121  $parameters = array_map(
122  $this->resolveParameter($container->getServiceLocator(), $requestedName),
123  $reflectionParameters
124  );
125 
126  return new $requestedName(...$parameters);
127  }
128 
132  public function canCreate(ContainerInterface $container, $requestedName)
133  {
134  if (! class_exists($requestedName)) {
135  return false;
136  }
137 
138  return in_array(DispatchableInterface::class, class_implements($requestedName), true);
139  }
140 
150  private function resolveParameter(ContainerInterface $container, $requestedName)
151  {
158  return function (ReflectionParameter $parameter) use ($container, $requestedName) {
159  if ($parameter->isArray()
160  && $parameter->getName() === 'config'
161  && $container->has('config')
162  ) {
163  return $container->get('config');
164  }
165 
166  if ($parameter->isArray()) {
167  return [];
168  }
169 
170  if (! $parameter->getClass()) {
171  return;
172  }
173 
174  $type = $parameter->getClass()->getName();
175  $type = isset($this->aliases[$type]) ? $this->aliases[$type] : $type;
176 
177  if (! $container->has($type)) {
178  throw new ServiceNotFoundException(sprintf(
179  'Unable to create controller "%s"; unable to resolve parameter "%s" using type hint "%s"',
180  $requestedName,
181  $parameter->getName(),
182  $type
183  ));
184  }
185 
186  return $container->get($type);
187  };
188  }
189 
199  public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
200  {
201  return $this->canCreate($serviceLocator, $requestedName);
202  }
203 
213  public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
214  {
215  return $this($serviceLocator, $requestedName);
216  }
217 }
__invoke(ContainerInterface $container, $requestedName, array $options=null)
$type
Definition: item.phtml:13
$reflectionClass
Definition: categories.php:25
createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
canCreate(ContainerInterface $container, $requestedName)
if(!isset($_GET['name'])) $name
Definition: log.php:14