-
Notifications
You must be signed in to change notification settings - Fork 0
/
LoaderTrait.php
71 lines (59 loc) · 2.23 KB
/
LoaderTrait.php
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
68
69
70
71
<?php
/*
* This file is part of the Koded package.
*
* (c) Mihail Binev <mihail@kodeart.com>
*
* Please view the LICENSE distributed with this source code
* for the full copyright and license information.
*/
namespace Koded\Serializer;
use Koded\Serializer\Generator\{CodeCompiler, GeneratorBuilder};
use Koded\Serializer\Metadata\{ClassMetadata, MetadataLoader};
trait LoaderTrait
{
private $generators = [];
private function load(string $type, Serializer $serializer): ObjectGenerator
{
if (isset($this->generators[$type])) {
return $this->generators[$type];
}
// load class metadata
$config = $serializer->getConfigurationLoader();
$metadata = (new MetadataLoader($config))
->loadMetadata(new \ReflectionClass($type), $serializer->getCache());
if (null === $metadata) {
throw SerializationError::forMissingMapping($type);
}
$generator = new GeneratorBuilder($config->getParameter('@directory'),
$config->getParameter('@namespace', '\\'));
if (false === class_exists($generator->getNamespaceName($metadata), true)) {
$this->process($generator, $metadata, $config->getParameter('@runtime', 'production'));
}
return $this->generators[$type] = $generator->new($metadata, $serializer);
}
private function process(GeneratorBuilder $generator, ClassMetadata $metadata, string $runtime): void
{
$file = $generator->getClassFileName($metadata);
switch ($runtime) {
case 'production':
break;
case 'dev':
if (false === file_exists($file)) {
file_put_contents($file, CodeCompiler::compile($generator, $metadata));
}
break;
case 'debug':
file_put_contents($file, CodeCompiler::compile($generator, $metadata));
break;
default:
throw SerializationError::forInvalidLoadingStrategy($runtime);
}
try {
/** @noinspection PhpIncludeInspection */
include_once $file;
} catch (\Throwable $e) {
$this->process($generator, $metadata, 'debug');
}
}
}