Skip to content

Instantly share code, notes, and snippets.

@xphere
Created November 5, 2013 16:18
Show Gist options
  • Select an option

  • Save xphere/7321565 to your computer and use it in GitHub Desktop.

Select an option

Save xphere/7321565 to your computer and use it in GitHub Desktop.
Adds globbing support to FileLocator in symfony/config
<?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\Finder\Finder;
/**
* FileLocator uses an array of pre-defined paths to find files.
*
* @author Fabien Potencier <fabien@symfony.com>
*/
class FileLocator implements FileLocatorInterface
{
protected $paths;
/**
* Constructor.
*
* @param string|array $paths A path or an array of paths where to look for resources
*/
public function __construct($paths = array())
{
$this->paths = (array) $paths;
}
/**
* Returns a full path for a given file name.
*
* @param mixed $name The file name to locate
* @param string $currentPath The current path
* @param Boolean $first Whether to return the first occurrence or an array of filenames
*
* @return string|array The full path to the file|An array of file paths
*
* @throws \InvalidArgumentException When file is not found
*/
public function locate($name, $currentPath = null, $first = true)
{
if ($this->isAbsolutePath($name)) {
if (!file_exists($name)) {
throw new \InvalidArgumentException(sprintf('The file "%s" does not exist.', $name));
}
return $name;
}
$filepaths = array();
if (null !== $currentPath) {
$file = $currentPath.DIRECTORY_SEPARATOR.$name;
if (file_exists($file)) {
if (true === $first) {
return $file;
}
$filepaths[] = $file;
// Here be dragons…
} elseif (strpbrk($name, '?*') !== false) {
$files = Finder::create()
->in(dirname($file))
->name(basename($file))
->files()
;
foreach ($files as $filename) {
$filename = (string) $filename;
if (true === $first) {
return $filename;
}
$filepaths[] = $filename;
}
if ($filepaths) {
return $filepaths;
}
}
// Dragons are no more
}
foreach ($this->paths as $path) {
if (file_exists($file = $path.DIRECTORY_SEPARATOR.$name)) {
if (true === $first) {
return $file;
}
$filepaths[] = $file;
}
}
if (!$filepaths) {
throw new \InvalidArgumentException(sprintf('The file "%s" does not exist (in: %s%s).', $name, null !== $currentPath ? $currentPath.', ' : '', implode(', ', $this->paths)));
}
return array_values(array_unique($filepaths));
}
/**
* Returns whether the file path is an absolute path.
*
* @param string $file A file path
*
* @return Boolean
*/
private function isAbsolutePath($file)
{
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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment