Skip to content

Commit 3112466

Browse files
committed
Add cache providers
1 parent 9aa9997 commit 3112466

File tree

7 files changed

+191
-26
lines changed

7 files changed

+191
-26
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace TypeLang\Mapper\Mapping\Provider;
6+
7+
use TypeLang\Mapper\Mapping\Reader\ReaderInterface;
8+
9+
abstract class CacheProvider extends Decorator
10+
{
11+
/**
12+
* @var non-empty-string
13+
*/
14+
protected const DEFAULT_CACHE_PREFIX = 'tlm_';
15+
16+
protected const DEFAULT_CACHE_TTL = null;
17+
18+
public function __construct(
19+
protected readonly string $prefix = self::DEFAULT_CACHE_PREFIX,
20+
protected readonly \DateInterval|int|null $ttl = self::DEFAULT_CACHE_TTL,
21+
ReaderInterface|ProviderInterface $delegate = new NullProvider(),
22+
) {
23+
parent::__construct($delegate);
24+
}
25+
26+
/**
27+
* @param \ReflectionClass<object> $class
28+
*
29+
* @return non-empty-string
30+
*/
31+
protected function getKey(\ReflectionClass $class): string
32+
{
33+
return $this->prefix
34+
. self::getKeyName($class)
35+
. self::getKeySuffix($class);
36+
}
37+
38+
/**
39+
* @param \ReflectionClass<object> $class
40+
*
41+
* @return non-empty-string
42+
*/
43+
protected static function getKeyName(\ReflectionClass $class): string
44+
{
45+
return \str_replace(['\\', "\0"], '_', \strtolower($class->name));
46+
}
47+
48+
/**
49+
* @param \ReflectionClass<object> $class
50+
*/
51+
protected static function getKeySuffix(\ReflectionClass $class): string
52+
{
53+
$pathname = $class->getFileName();
54+
55+
if ($pathname === false) {
56+
return '';
57+
}
58+
59+
return (string) \filemtime($pathname);
60+
}
61+
}

src/Mapping/Provider/Decorator.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace TypeLang\Mapper\Mapping\Provider;
6+
7+
use TypeLang\Mapper\Mapping\Metadata\ClassMetadata;
8+
use TypeLang\Mapper\Mapping\Reader\ReaderInterface;
9+
use TypeLang\Mapper\Runtime\Parser\TypeParserInterface;
10+
use TypeLang\Mapper\Runtime\Repository\TypeRepositoryInterface;
11+
12+
abstract class Decorator implements ProviderInterface
13+
{
14+
private readonly ProviderInterface $delegate;
15+
16+
public function __construct(
17+
ProviderInterface|ReaderInterface $delegate = new NullProvider(),
18+
) {
19+
$this->delegate = $this->createProvider($delegate);
20+
}
21+
22+
private function createProvider(ProviderInterface|ReaderInterface $readerOrProvider): ProviderInterface
23+
{
24+
if ($readerOrProvider instanceof ReaderInterface) {
25+
return $this->createDefaultProvider($readerOrProvider);
26+
}
27+
28+
return $readerOrProvider;
29+
}
30+
31+
private function createDefaultProvider(ReaderInterface $reader): ProviderInterface
32+
{
33+
return new MetadataReaderProvider($reader);
34+
}
35+
36+
public function getClassMetadata(
37+
\ReflectionClass $class,
38+
TypeRepositoryInterface $types,
39+
TypeParserInterface $parser,
40+
): ClassMetadata {
41+
return $this->delegate->getClassMetadata($class, $types, $parser);
42+
}
43+
}

src/Mapping/Provider/InMemoryProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use TypeLang\Mapper\Runtime\Parser\TypeParserInterface;
99
use TypeLang\Mapper\Runtime\Repository\TypeRepositoryInterface;
1010

11-
final class InMemoryProvider extends Provider
11+
final class InMemoryProvider extends Decorator
1212
{
1313
/**
1414
* @var array<class-string, ClassMetadata<object>>

src/Mapping/Provider/MetadataReaderProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ private function createDefaultExpressionLanguage(): ExpressionLanguage
331331
if (!\class_exists(ExpressionLanguage::class)) {
332332
throw ComposerPackageRequiredException::becausePackageNotInstalled(
333333
package: 'symfony/expression-language',
334-
purpose: 'expressions support',
334+
purpose: 'condition expressions support',
335335
);
336336
}
337337

src/Mapping/Provider/Provider.php

Lines changed: 0 additions & 24 deletions
This file was deleted.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace TypeLang\Mapper\Mapping\Provider;
6+
7+
use Psr\SimpleCache\CacheInterface;
8+
use TypeLang\Mapper\Mapping\Metadata\ClassMetadata;
9+
use TypeLang\Mapper\Mapping\Reader\ReaderInterface;
10+
use TypeLang\Mapper\Runtime\Parser\TypeParserInterface;
11+
use TypeLang\Mapper\Runtime\Repository\TypeRepositoryInterface;
12+
13+
final class Psr16CacheProvider extends CacheProvider
14+
{
15+
public function __construct(
16+
private readonly CacheInterface $psr16,
17+
string $prefix = self::DEFAULT_CACHE_PREFIX,
18+
\DateInterval|int|null $ttl = self::DEFAULT_CACHE_TTL,
19+
ReaderInterface|ProviderInterface $delegate = new NullProvider(),
20+
) {
21+
parent::__construct($prefix, $ttl, $delegate);
22+
}
23+
24+
public function getClassMetadata(
25+
\ReflectionClass $class,
26+
TypeRepositoryInterface $types,
27+
TypeParserInterface $parser,
28+
): ClassMetadata {
29+
$result = $this->psr16->get($key = $this->getKey($class));
30+
31+
if (!$result instanceof ClassMetadata) {
32+
$result = parent::getClassMetadata($class, $types, $parser);
33+
34+
$this->psr16->set($key, $result, $this->ttl);
35+
}
36+
37+
return $result;
38+
}
39+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace TypeLang\Mapper\Mapping\Provider;
6+
7+
use Psr\Cache\CacheItemPoolInterface;
8+
use TypeLang\Mapper\Mapping\Metadata\ClassMetadata;
9+
use TypeLang\Mapper\Mapping\Reader\ReaderInterface;
10+
use TypeLang\Mapper\Runtime\Parser\TypeParserInterface;
11+
use TypeLang\Mapper\Runtime\Repository\TypeRepositoryInterface;
12+
13+
final class Psr6CacheProvider extends CacheProvider
14+
{
15+
public function __construct(
16+
private readonly CacheItemPoolInterface $psr6,
17+
string $prefix = self::DEFAULT_CACHE_PREFIX,
18+
\DateInterval|int|null $ttl = self::DEFAULT_CACHE_TTL,
19+
ReaderInterface|ProviderInterface $delegate = new NullProvider(),
20+
) {
21+
parent::__construct($prefix, $ttl, $delegate);
22+
}
23+
24+
public function getClassMetadata(
25+
\ReflectionClass $class,
26+
TypeRepositoryInterface $types,
27+
TypeParserInterface $parser,
28+
): ClassMetadata {
29+
$item = $this->psr6->getItem($this->getKey($class));
30+
31+
$result = $item->get();
32+
33+
if ($result instanceof ClassMetadata) {
34+
return $result;
35+
}
36+
37+
$result = parent::getClassMetadata($class, $types, $parser);
38+
39+
$item->expiresAfter($this->ttl);
40+
$item->set($result);
41+
42+
$this->psr6->saveDeferred($item);
43+
44+
return $result;
45+
}
46+
}

0 commit comments

Comments
 (0)