1: <?php
2:
3: declare(strict_types=1);
4:
5: namespace LaravelUi5\OData\Service\Cache;
6:
7: use LaravelUi5\OData\Service\Contracts\ODataServiceInterface;
8: use LaravelUi5\OData\Service\Resolver\ResolverMap;
9: use ReflectionClass;
10:
11: /**
12: * Loads a cached ResolverMap from the generated Edm\ directory next to a service class.
13: *
14: * Convention: {ServiceClassNamespace}\Edm\ResolverMap with a static load() method.
15: */
16: final class ResolverMapLoader
17: {
18: /**
19: * Attempt to load a cached ResolverMap for the given service.
20: *
21: * Returns null when no cache exists.
22: */
23: public static function forService(ODataServiceInterface $service): ?ResolverMap
24: {
25: // Check the file exists before class_exists() to avoid autoloader
26: // errors when the cache directory has been cleared but the in-memory
27: // classmap still references the deleted files.
28: $refl = new ReflectionClass($service);
29: $cacheFile = dirname($refl->getFileName()) . '/Edm/ResolverMap.php';
30: if (!file_exists($cacheFile)) {
31: return null;
32: }
33:
34: $className = self::resolverMapClassName($service);
35:
36: if (!class_exists($className)) {
37: return null;
38: }
39:
40: return $className::load();
41: }
42:
43: /**
44: * Derive the FQCN of the cached ResolverMap class from a service instance.
45: *
46: * Convention: {ServiceClassNamespace}\Edm\ResolverMap
47: */
48: public static function resolverMapClassName(ODataServiceInterface $service): string
49: {
50: $refl = new ReflectionClass($service);
51: return $refl->getNamespaceName() . '\\Edm\\ResolverMap';
52: }
53: }
54: