Completed
Push — theme-bundle ( 2fd15f...927586 )
by Kamil
26:43 queued 10s
created

RecursiveFileLocator::isAbsolutePath()   B

Complexity

Conditions 9
Paths 2

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
dl 0
loc 14
rs 7.7561
c 2
b 1
f 0
cc 9
eloc 8
nc 2
nop 1
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sylius\Bundle\ThemeBundle\Locator;
13
14
use Symfony\Component\Config\FileLocatorInterface;
15
use Symfony\Component\Filesystem\Filesystem;
16
use Symfony\Component\Finder\Finder;
17
use Symfony\Component\Finder\SplFileInfo;
18
19
/**
20
 * @author Kamil Kokot <[email protected]>
21
 */
22
final class RecursiveFileLocator implements FileLocatorInterface
23
{
24
    /**
25
     * @var Filesystem
26
     */
27
    private $filesystem;
28
29
    /**
30
     * @var array
31
     */
32
    private $paths;
33
34
    /**
35
     * @param Filesystem $filesystem
36
     * @param string|array $paths A path or an array of paths where to look for resources
37
     */
38
    public function __construct(Filesystem $filesystem, $paths = [])
39
    {
40
        $this->filesystem = $filesystem;
41
        $this->paths = (array) $paths;
42
    }
43
44
    /**
45
     * {@inheritdoc}
46
     */
47
    public function locate($name, $currentPath = null, $first = true)
48
    {
49
        if (empty($name)) {
50
            throw new \InvalidArgumentException('An empty file name is not valid to be located.');
51
        }
52
53
        if ($this->filesystem->isAbsolutePath($name)) {
54
            if (!$this->filesystem->exists($name)) {
55
                throw new \InvalidArgumentException(sprintf('The file "%s" does not exist.', $name));
56
            }
57
58
            return $name;
59
        }
60
61
        $directories = $this->paths;
62
        if (null !== $currentPath) {
63
            $directories[] = $currentPath;
64
65
            $directories = array_values(array_unique($directories));
66
        }
67
68
        $filepaths = [];
69
70
        $finder = new Finder();
71
        $finder
72
            ->files()
73
            ->name($name)
74
            ->ignoreUnreadableDirs()
75
            ->in($directories)
76
        ;
77
78
        /** @var SplFileInfo $file */
79
        if ($first && null !== $file = $finder->getIterator()->current()) {
80
            return $file->getPathname();
81
        }
82
83
        foreach ($finder as $file) {
84
            $filepaths[] = $file->getPathname();
85
        }
86
87
        if (!$filepaths) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $filepaths of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
88
            throw new \InvalidArgumentException(sprintf('The file "%s" does not exist (in: %s).', $name, implode(', ', $directories)));
89
        }
90
91
        return array_values(array_unique($filepaths));
92
    }
93
}
94