‪TYPO3CMS  ‪main
ServiceProviderRegistry.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Container\ContainerInterface;
22 use TYPO3\CMS\Core\Package\PackageManager;
23 
30 class ‪ServiceProviderRegistry implements \IteratorAggregate
31 {
35  private ‪$packageManager;
36 
40  private ‪$failsafe;
41 
47  private ‪$instances;
48 
55  private ‪$serviceFactories = [];
56 
63  private ‪$serviceExtensions = [];
64 
70  public function ‪__construct(PackageManager ‪$packageManager, bool ‪$failsafe = false)
71  {
72  $this->packageManager = ‪$packageManager;
73  $this->failsafe = ‪$failsafe;
74  }
75 
82  public function ‪has(string $packageKey): bool
83  {
84  if (isset($this->instances[$packageKey])) {
85  return true;
86  }
87 
88  if ($this->packageManager->isPackageActive($packageKey)) {
89  if ($this->failsafe && $this->packageManager->getPackage($packageKey)->isPartOfMinimalUsableSystem() === false) {
90  return false;
91  }
92  return true;
93  }
94 
95  return false;
96  }
97 
103  public function get(string $packageKey): ‪ServiceProviderInterface
104  {
105  return $this->instances[$packageKey] ?? $this->‪create($packageKey);
106  }
107 
114  private function ‪create(string $packageKey, ‪Package $package = null): ‪ServiceProviderInterface
115  {
116  if ($package === null) {
117  if (!$this->packageManager->isPackageActive($packageKey)) {
118  throw new \InvalidArgumentException('Package ' . $packageKey . ' is not active', 1550351445);
119  }
120  $package = $this->packageManager->getPackage($packageKey);
121  }
122  $serviceProviderClassName = $package->getServiceProvider();
123  $instance = new $serviceProviderClassName($package);
124 
125  if (!$instance instanceof ‪ServiceProviderInterface) {
126  throw new \InvalidArgumentException('Service providers need to implement ' . ServiceProviderInterface::class, 1550302554);
127  }
128 
129  return $this->instances[$packageKey] = $instance;
130  }
131 
138  public function ‪getFactories(string $packageKey): array
139  {
140  return $this->serviceFactories[$packageKey] ?? ($this->serviceFactories[$packageKey] = $this->get($packageKey)->‪getFactories());
141  }
142 
149  public function ‪getExtensions(string $packageKey): array
150  {
151  return $this->serviceExtensions[$packageKey] ?? ($this->serviceExtensions[$packageKey] = $this->get($packageKey)->‪getExtensions());
152  }
153 
159  public function ‪createService(string $packageKey, string $serviceName, ContainerInterface $container)
160  {
161  $factory = $this->‪getFactories($packageKey)[$serviceName];
162  return $factory($container);
163  }
164 
171  public function ‪extendService(string $packageKey, string $serviceName, ContainerInterface $container, $previous = null)
172  {
173  $extension = $this->‪getExtensions($packageKey)[$serviceName];
174  return $extension($container, $previous);
175  }
176 
177  public function ‪getIterator(): \Generator
178  {
179  foreach ($this->packageManager->getActivePackages() as $package) {
180  if ($this->failsafe && $package->isPartOfMinimalUsableSystem() === false) {
181  continue;
182  }
183  $packageKey = $package->getPackageKey();
184  yield $packageKey => ($this->instances[$packageKey] ?? $this->‪create($packageKey, $package));
185  }
186  }
187 }
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\create
‪create(string $packageKey, Package $package=null)
Definition: ServiceProviderRegistry.php:109
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\has
‪bool has(string $packageKey)
Definition: ServiceProviderRegistry.php:77
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\getExtensions
‪getExtensions(string $packageKey)
Definition: ServiceProviderRegistry.php:144
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\createService
‪mixed createService(string $packageKey, string $serviceName, ContainerInterface $container)
Definition: ServiceProviderRegistry.php:154
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\$instances
‪array $instances
Definition: ServiceProviderRegistry.php:44
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\getIterator
‪getIterator()
Definition: ServiceProviderRegistry.php:172
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\__construct
‪__construct(PackageManager $packageManager, bool $failsafe=false)
Definition: ServiceProviderRegistry.php:65
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\$failsafe
‪bool $failsafe
Definition: ServiceProviderRegistry.php:38
‪TYPO3\CMS\Core\DependencyInjection
Definition: AutowireInjectMethodsPass.php:18
‪TYPO3\CMS\Core\Package\Package
Definition: Package.php:30
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry
Definition: ServiceProviderRegistry.php:31
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\getFactories
‪getFactories(string $packageKey)
Definition: ServiceProviderRegistry.php:133
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderInterface
Definition: ServiceProviderInterface.php:26
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\extendService
‪mixed extendService(string $packageKey, string $serviceName, ContainerInterface $container, $previous=null)
Definition: ServiceProviderRegistry.php:166
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\$serviceExtensions
‪array $serviceExtensions
Definition: ServiceProviderRegistry.php:58
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\$serviceFactories
‪array $serviceFactories
Definition: ServiceProviderRegistry.php:51
‪TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry\$packageManager
‪PackageManager $packageManager
Definition: ServiceProviderRegistry.php:34