-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRepositoryManager.php
More file actions
128 lines (74 loc) · 3.44 KB
/
RepositoryManager.php
File metadata and controls
128 lines (74 loc) · 3.44 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php namespace Quallsbenson\Repository;
use Quallsbenson\Utility\Object\ObjectResolver;
use Quallsbenson\Repository\Database\DatabaseManagerInterface;
class RepositoryManager{
protected $modelNamespace,
$repositories = array(),
$repositoryResolver,
$repositoryInitializerResolver,
$modelResolver,
$initializationServices = array(),
$databaseManager;
public function __construct($repositoryNamespace, $modelNamespace, $repositoryInitializerNamespace = null){
//set namespace to load models from
$this->getModelResolver()->addNamespace($modelNamespace);
//resolve repositories from the given namespace
$this->getRepositoryResolver()->addNamespace($repositoryNamespace);
//resolve repository from the given namespace
//but default to the current namespace if none found
$this->getRepositoryInitializerResolver()->addNamespace($repositoryInitializerNamespace)
->addNamespace(__NAMESPACE__);
}
public function getRepositoryResolver(){
return $this->repositoryResolver ?: $this->repositoryResolver = new ObjectResolver;
}
public function getRepositoryInitializerResolver(){
return $this->repositoryInitializerResolver ?: $this->repositoryInitializerResolver = new ObjectResolver;
}
public function getModelResolver(){
return $this->modelResolver ?: $this->modelResolver = new ObjectResolver;
}
public function get($repositoryName){
if(isset($this->repositories[$repositoryName]))
return $this->repositories[$repositoryName];
$repo = $this->getRepository($repositoryName);
$this->repositories[$repositoryName] = $this->initializeRepository($repositoryName, $repo);
return $this->repositories[$repositoryName];
}
public function setInitializationServices(array $param){
$this->initializationServices = $param;
}
public function setDatabaseManager(DatabaseManagerInterface $manager){
$this->databaseManager = $manager;
}
protected function getRepository($name){
$repoWrapper = $this->getRepositoryResolver()->resolve($name.'Repository');
if(!$repoWrapper)
throw new \Exception('Repository ' .$name .' was not found');
$repoInstance = $repoWrapper->getInstance();
if( ($repoInstance instanceof RepositoryInterface) === false )
throw new \Exception('Repository must implement the Repository Interface');
return $repoInstance;
}
protected function getRepositoryInitializer($name){
$resolver = $this->getRepositoryInitializerResolver();
$name = $name .'RepositoryInitializer';
$default = 'repositoryInitializer';
$repoInitializerWrapper = $resolver->resolve(array($name, $default));
if(!$repoInitializerWrapper){
throw new \Exception('Repository Initializer Not Found');
}
$repoInitializerInstance = $repoInitializerWrapper->getInstance();
if(($repoInitializerInstance instanceof RepositoryInitializerInterface) === false){
throw new \Exception('Repository Initializer must implement RepositoryInitializerInterface');
}
return $repoInitializerInstance;
}
protected function initializeRepository($name, RepositoryInterface $repository){
$initializer = $this->getRepositoryInitializer($name);
$repository->setModelResolver( $this->getModelResolver() );
$repository->setDatabaseManager( $this->databaseManager );
$initializer->initialize( $repository, $this->initializationServices );
return $repository;
}
}