-
Notifications
You must be signed in to change notification settings - Fork 2
/
ImageEntityClassLocator.php
105 lines (93 loc) · 3.24 KB
/
ImageEntityClassLocator.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
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
<?php
/**
* This file is part of the IrishDan\ResponsiveImageBundle package.
*
* (c) Daniel Byrne <danielbyrne@outlook.com>
*
* For the full copyright and license information, please view the LICENSE file that was distributed with this source
* code.
*/
namespace IrishDan\ResponsiveImageBundle;
use Symfony\Component\HttpKernel\Config\FileLocator;
/**
* Class ImageEntityClassLocator
*
* The aim is to find entity class which implements ResponsiveImageInterface
*
* @property array bundles
* @package IrishDan\ResponsiveImageBundle
*/
class ImageEntityClassLocator
{
const RESPONSIVE_IMAGE_INTERFACE = 'IrishDan\ResponsiveImageBundle\ResponsiveImageInterface';
/**
* @var null|string
*/
protected $className = null;
/**
* @var FileLocator
*/
protected $fileLocator;
/**
* @var string
*/
protected $entityDirectory = 'Entity';
/**
* ImageEntityClassLocator constructor.
*
* @param $bundles
* @param FileLocator $fileLocator
*/
public function __construct($bundles = [], FileLocator $fileLocator)
{
$this->bundles = $bundles;
$this->fileLocator = $fileLocator;
}
/**
* @return mixed
*/
public function getClassName()
{
// Scan Bundle directories for entity directory
if (empty($this->className)) {
foreach ($this->bundles as $key => $namespace) {
$path = $this->fileLocator->locate('@' . $key);
$path .= $this->entityDirectory;
if (file_exists($path)) {
// Remove the final part of the namespace
$namespaceParts = explode('\\', $namespace);
array_pop($namespaceParts);
$namespaceParts[] = $this->entityDirectory;
$namespace = implode('\\', $namespaceParts);
// switch any /'s into \'s for namespaces
$namespace = str_replace('/', '\\', $namespace);
$allFiles = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
$phpFiles = new \RegexIterator($allFiles, '/\.php$/');
foreach ($phpFiles as $phpFile) {
$fileName = $phpFile->getFileName();
$className = substr($fileName, 0, -4);
$FQCN = $namespace . '\\' . $className;
// Try to load the file as a class and determine if it implements the interface
try {
$reflect = new \ReflectionClass($FQCN);
if ($reflect->implementsInterface(self::RESPONSIVE_IMAGE_INTERFACE)) {
$this->className = $FQCN;
break;
}
} catch (\ReflectionException $e) {
// No action required
}
}
}
}
}
return $this->className;
}
/**
* @param string $entityDirectory
*/
public function setEntityDirectory($entityDirectory)
{
$this->entityDirectory = $entityDirectory;
}
}