You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.5 KiB
94 lines
2.5 KiB
<?php |
|
|
|
/* |
|
* This file is part of the Symfony package. |
|
* |
|
* (c) Fabien Potencier <fabien@symfony.com> |
|
* |
|
* For the full copyright and license information, please view the LICENSE |
|
* file that was distributed with this source code. |
|
*/ |
|
|
|
namespace Symfony\Component\Config; |
|
|
|
use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException; |
|
|
|
/** |
|
* FileLocator uses an array of pre-defined paths to find files. |
|
* |
|
* @author Fabien Potencier <fabien@symfony.com> |
|
*/ |
|
class FileLocator implements FileLocatorInterface |
|
{ |
|
protected $paths; |
|
|
|
/** |
|
* @param string|string[] $paths A path or an array of paths where to look for resources |
|
*/ |
|
public function __construct($paths = []) |
|
{ |
|
$this->paths = (array) $paths; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function locate(string $name, string $currentPath = null, bool $first = true) |
|
{ |
|
if ('' === $name) { |
|
throw new \InvalidArgumentException('An empty file name is not valid to be located.'); |
|
} |
|
|
|
if ($this->isAbsolutePath($name)) { |
|
if (!file_exists($name)) { |
|
throw new FileLocatorFileNotFoundException(sprintf('The file "%s" does not exist.', $name), 0, null, [$name]); |
|
} |
|
|
|
return $name; |
|
} |
|
|
|
$paths = $this->paths; |
|
|
|
if (null !== $currentPath) { |
|
array_unshift($paths, $currentPath); |
|
} |
|
|
|
$paths = array_unique($paths); |
|
$filepaths = $notfound = []; |
|
|
|
foreach ($paths as $path) { |
|
if (@file_exists($file = $path.\DIRECTORY_SEPARATOR.$name)) { |
|
if (true === $first) { |
|
return $file; |
|
} |
|
$filepaths[] = $file; |
|
} else { |
|
$notfound[] = $file; |
|
} |
|
} |
|
|
|
if (!$filepaths) { |
|
throw new FileLocatorFileNotFoundException(sprintf('The file "%s" does not exist (in: "%s").', $name, implode('", "', $paths)), 0, null, $notfound); |
|
} |
|
|
|
return $filepaths; |
|
} |
|
|
|
/** |
|
* Returns whether the file path is an absolute path. |
|
*/ |
|
private function isAbsolutePath(string $file): bool |
|
{ |
|
if ('/' === $file[0] || '\\' === $file[0] |
|
|| (\strlen($file) > 3 && ctype_alpha($file[0]) |
|
&& ':' === $file[1] |
|
&& ('\\' === $file[2] || '/' === $file[2]) |
|
) |
|
|| null !== parse_url($file, \PHP_URL_SCHEME) |
|
) { |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
}
|
|
|