1 | <?php |
||
19 | class FluentDriver implements MappingDriver |
||
20 | { |
||
21 | /** |
||
22 | * @var MapperSet |
||
23 | */ |
||
24 | protected $mappers; |
||
25 | |||
26 | /** |
||
27 | * @var callable |
||
28 | */ |
||
29 | protected $fluentFactory; |
||
30 | |||
31 | /** |
||
32 | * The file extension of mapping documents. |
||
33 | * |
||
34 | * @var string |
||
35 | */ |
||
36 | protected $fileExtension = '.php'; |
||
37 | |||
38 | /** |
||
39 | * Initializes a new FileDriver that looks in the given path(s) for mapping |
||
40 | * documents and operates in the specified operating mode. |
||
41 | * |
||
42 | * @param string[] $mappings |
||
43 | * @param array $paths |
||
44 | * |
||
45 | * @throws MappingException |
||
46 | */ |
||
47 | public function __construct(array $mappings = [], array $paths = []) |
||
63 | |||
64 | /** |
||
65 | * Loads the metadata for the specified class into the provided container. |
||
66 | * |
||
67 | * @param string $className |
||
68 | * @param ClassMetadata $metadata |
||
69 | */ |
||
70 | 24 | public function loadMetadataForClass($className, ClassMetadata $metadata) |
|
76 | |||
77 | /** |
||
78 | * Gets the names of all mapped classes known to this driver. |
||
79 | * |
||
80 | * @throws MappingException |
||
81 | * |
||
82 | * @return string[] The names of all mapped classes known to this driver. |
||
83 | */ |
||
84 | 48 | public function getAllClassNames() |
|
88 | |||
89 | /** |
||
90 | * Returns whether the class with the specified name should have its metadata loaded. |
||
91 | * This is only the case if it is either mapped as an Entity or a MappedSuperclass. |
||
92 | * |
||
93 | * @param string $className |
||
94 | * |
||
95 | * @return bool |
||
96 | */ |
||
97 | 16 | public function isTransient($className) |
|
103 | |||
104 | /** |
||
105 | * @param array $paths |
||
106 | * |
||
107 | * @throws MappingException |
||
108 | */ |
||
109 | public function loadPaths(array $paths) |
||
110 | { |
||
111 | $classes = []; |
||
|
|||
112 | $includedFiles = []; |
||
113 | |||
114 | foreach ($paths as $path) { |
||
115 | if (!is_dir($path)) { |
||
116 | throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); |
||
117 | } |
||
118 | |||
119 | $iterator = new RegexIterator( |
||
120 | new RecursiveIteratorIterator( |
||
121 | new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), |
||
122 | RecursiveIteratorIterator::LEAVES_ONLY |
||
123 | ), |
||
124 | '/^.+'.preg_quote($this->fileExtension).'$/i', |
||
125 | RecursiveRegexIterator::GET_MATCH |
||
126 | ); |
||
127 | |||
128 | foreach ($iterator as $file) { |
||
129 | $sourceFile = $file[0]; |
||
130 | |||
131 | if (!preg_match('(^phar:)i', $sourceFile)) { |
||
132 | $sourceFile = realpath($sourceFile); |
||
133 | } |
||
134 | |||
135 | require_once $sourceFile; |
||
136 | |||
137 | $includedFiles[] = $sourceFile; |
||
138 | } |
||
139 | |||
140 | $declared = get_declared_classes(); |
||
141 | |||
142 | foreach ($declared as $className) { |
||
143 | $rc = new ReflectionClass($className); |
||
144 | $sourceFile = $rc->getFileName(); |
||
145 | |||
146 | if (!in_array($sourceFile, $includedFiles)) { |
||
147 | continue; |
||
148 | } |
||
149 | |||
150 | if ($rc->isAbstract() || $rc->isInterface()) { |
||
151 | continue; |
||
152 | } |
||
153 | |||
154 | if (!$rc->implementsInterface(Mapping::class)) { |
||
155 | continue; |
||
156 | } |
||
157 | |||
158 | if ($this->isTransient($className)) { |
||
159 | |||
160 | /** @var Mapping $mapping */ |
||
161 | $mapping = $rc->newInstanceWithoutConstructor(); |
||
162 | |||
163 | $this->addMapping($mapping); |
||
164 | } |
||
165 | } |
||
166 | } |
||
167 | } |
||
168 | |||
169 | /** |
||
170 | * @param string[] $mappings |
||
171 | * |
||
172 | * @throws InvalidArgumentException |
||
173 | */ |
||
174 | 328 | public function addMappings(array $mappings = []) |
|
190 | |||
191 | /** |
||
192 | * @param Mapping $mapping |
||
193 | * |
||
194 | * @throws MappingException |
||
195 | * |
||
196 | * @return void |
||
197 | */ |
||
198 | 348 | public function addMapping(Mapping $mapping) |
|
202 | |||
203 | /** |
||
204 | * @return MapperSet |
||
205 | */ |
||
206 | 20 | public function getMappers() |
|
210 | |||
211 | /** |
||
212 | * Override the default Fluent factory method with a custom one. |
||
213 | * Use this to implement your own Fluent builder. |
||
214 | * The method will receive a ClassMetadata object as its only argument. |
||
215 | * |
||
216 | * @param callable $factory |
||
217 | */ |
||
218 | 4 | public function setFluentFactory(callable $factory) |
|
222 | |||
223 | /** |
||
224 | * @param ClassMetadata $metadata |
||
225 | * |
||
226 | * @return Fluent |
||
227 | */ |
||
228 | 20 | protected function getFluent(ClassMetadata $metadata) |
|
232 | } |
||
233 |
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.
Both the
$myVar
assignment in line 1 and the$higher
assignment in line 2 are dead. The first because$myVar
is never used and the second because$higher
is always overwritten for every possible time line.