summaryrefslogtreecommitdiff
path: root/vendor/symfony/service-contracts/ServiceLocatorTrait.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2024-08-13 23:45:21 +0200
committerpolo <ordipolo@gmx.fr>2024-08-13 23:45:21 +0200
commitbf6655a534a6775d30cafa67bd801276bda1d98d (patch)
treec6381e3f6c81c33eab72508f410b165ba05f7e9c /vendor/symfony/service-contracts/ServiceLocatorTrait.php
parent94d67a4b51f8e62e7d518cce26a526ae1ec48278 (diff)
downloadAppliGestionPHP-bf6655a534a6775d30cafa67bd801276bda1d98d.zip
VERSION 0.2 doctrine ORM et entités
Diffstat (limited to 'vendor/symfony/service-contracts/ServiceLocatorTrait.php')
-rw-r--r--vendor/symfony/service-contracts/ServiceLocatorTrait.php115
1 files changed, 115 insertions, 0 deletions
diff --git a/vendor/symfony/service-contracts/ServiceLocatorTrait.php b/vendor/symfony/service-contracts/ServiceLocatorTrait.php
new file mode 100644
index 0000000..b62ec3e
--- /dev/null
+++ b/vendor/symfony/service-contracts/ServiceLocatorTrait.php
@@ -0,0 +1,115 @@
1<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Contracts\Service;
13
14use Psr\Container\ContainerExceptionInterface;
15use Psr\Container\NotFoundExceptionInterface;
16
17// Help opcache.preload discover always-needed symbols
18class_exists(ContainerExceptionInterface::class);
19class_exists(NotFoundExceptionInterface::class);
20
21/**
22 * A trait to help implement ServiceProviderInterface.
23 *
24 * @author Robin Chalas <robin.chalas@gmail.com>
25 * @author Nicolas Grekas <p@tchwork.com>
26 */
27trait ServiceLocatorTrait
28{
29 private array $factories;
30 private array $loading = [];
31 private array $providedTypes;
32
33 /**
34 * @param array<string, callable> $factories
35 */
36 public function __construct(array $factories)
37 {
38 $this->factories = $factories;
39 }
40
41 public function has(string $id): bool
42 {
43 return isset($this->factories[$id]);
44 }
45
46 public function get(string $id): mixed
47 {
48 if (!isset($this->factories[$id])) {
49 throw $this->createNotFoundException($id);
50 }
51
52 if (isset($this->loading[$id])) {
53 $ids = array_values($this->loading);
54 $ids = \array_slice($this->loading, array_search($id, $ids));
55 $ids[] = $id;
56
57 throw $this->createCircularReferenceException($id, $ids);
58 }
59
60 $this->loading[$id] = $id;
61 try {
62 return $this->factories[$id]($this);
63 } finally {
64 unset($this->loading[$id]);
65 }
66 }
67
68 public function getProvidedServices(): array
69 {
70 if (!isset($this->providedTypes)) {
71 $this->providedTypes = [];
72
73 foreach ($this->factories as $name => $factory) {
74 if (!\is_callable($factory)) {
75 $this->providedTypes[$name] = '?';
76 } else {
77 $type = (new \ReflectionFunction($factory))->getReturnType();
78
79 $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?';
80 }
81 }
82 }
83
84 return $this->providedTypes;
85 }
86
87 private function createNotFoundException(string $id): NotFoundExceptionInterface
88 {
89 if (!$alternatives = array_keys($this->factories)) {
90 $message = 'is empty...';
91 } else {
92 $last = array_pop($alternatives);
93 if ($alternatives) {
94 $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last);
95 } else {
96 $message = sprintf('only knows about the "%s" service.', $last);
97 }
98 }
99
100 if ($this->loading) {
101 $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message);
102 } else {
103 $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message);
104 }
105
106 return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface {
107 };
108 }
109
110 private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface
111 {
112 return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface {
113 };
114 }
115}