-
-
Notifications
You must be signed in to change notification settings - Fork 962
Expand file tree
/
Copy pathLinksHandlerLocatorTrait.php
More file actions
67 lines (51 loc) · 2.1 KB
/
LinksHandlerLocatorTrait.php
File metadata and controls
67 lines (51 loc) · 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
/*
* This file is part of the API Platform project.
*
* (c) Kévin Dunglas <dunglas@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace ApiPlatform\Doctrine\Common\State;
use ApiPlatform\Metadata\Exception\RuntimeException;
use ApiPlatform\Metadata\Operation;
use Psr\Container\ContainerInterface;
/**
* @internal
*/
trait LinksHandlerLocatorTrait
{
private ?ContainerInterface $handleLinksLocator;
private function getLinksHandler(Operation $operation): ?callable
{
if (!($options = $operation->getStateOptions()) || !$options instanceof Options) {
return null;
}
$handleLinks = $options->getHandleLinks();
if (\is_callable($handleLinks)) {
return $handleLinks;
}
if (\is_array($handleLinks) && 2 === \count($handleLinks) && class_exists($handleLinks[0])) {
[$className, $methodName] = $handleLinks;
if (method_exists($className, $methodName)) {
return $handleLinks;
}
$suggestedMethod = $this->findSimilarMethod($className, $methodName);
throw new RuntimeException(\sprintf('Method "%s" does not exist in class "%s".%s', $methodName, $className, $suggestedMethod ? \sprintf(' Did you mean "%s"?', $suggestedMethod) : ''));
}
if ($this->handleLinksLocator && \is_string($handleLinks) && $this->handleLinksLocator->has($handleLinks)) {
return [$this->handleLinksLocator->get($handleLinks), 'handleLinks'];
}
throw new RuntimeException(\sprintf('Could not find handleLinks service "%s"', $handleLinks));
}
private function findSimilarMethod(string $className, string $methodName): ?string
{
$methods = get_class_methods($className);
$similarMethods = array_filter($methods, static function ($method) use ($methodName): bool {
return levenshtein($methodName, $method) <= 3;
});
return $similarMethods ? reset($similarMethods) : null;
}
}