use Symfony\Component\Config\FileLocatorInterface;
use Symfony\Component\Config\Exception\FileLoaderLoadException;
use Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException;
+use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException;
+use Symfony\Component\Config\Resource\FileExistenceResource;
+use Symfony\Component\Config\Resource\GlobResource;
/**
* FileLoader is the abstract class used by all built-in loaders that are file based.
*/
abstract class FileLoader extends Loader
{
- /**
- * @var array
- */
protected static $loading = array();
- /**
- * @var FileLocatorInterface
- */
protected $locator;
private $currentDir;
- /**
- * Constructor.
- *
- * @param FileLocatorInterface $locator A FileLocatorInterface instance
- */
public function __construct(FileLocatorInterface $locator)
{
$this->locator = $locator;
*
* @throws FileLoaderLoadException
* @throws FileLoaderImportCircularReferenceException
+ * @throws FileLocatorFileNotFoundException
*/
public function import($resource, $type = null, $ignoreErrors = false, $sourceResource = null)
+ {
+ if (is_string($resource) && strlen($resource) !== $i = strcspn($resource, '*?{[')) {
+ $ret = array();
+ $isSubpath = 0 !== $i && false !== strpos(substr($resource, 0, $i), '/');
+ foreach ($this->glob($resource, false, $_, $ignoreErrors || !$isSubpath) as $path => $info) {
+ if (null !== $res = $this->doImport($path, $type, $ignoreErrors, $sourceResource)) {
+ $ret[] = $res;
+ }
+ $isSubpath = true;
+ }
+
+ if ($isSubpath) {
+ return isset($ret[1]) ? $ret : (isset($ret[0]) ? $ret[0] : null);
+ }
+ }
+
+ return $this->doImport($resource, $type, $ignoreErrors, $sourceResource);
+ }
+
+ /**
+ * @internal
+ */
+ protected function glob($pattern, $recursive, &$resource = null, $ignoreErrors = false)
+ {
+ if (strlen($pattern) === $i = strcspn($pattern, '*?{[')) {
+ $prefix = $pattern;
+ $pattern = '';
+ } elseif (0 === $i || false === strpos(substr($pattern, 0, $i), '/')) {
+ $prefix = '.';
+ $pattern = '/'.$pattern;
+ } else {
+ $prefix = dirname(substr($pattern, 0, 1 + $i));
+ $pattern = substr($pattern, strlen($prefix));
+ }
+
+ try {
+ $prefix = $this->locator->locate($prefix, $this->currentDir, true);
+ } catch (FileLocatorFileNotFoundException $e) {
+ if (!$ignoreErrors) {
+ throw $e;
+ }
+
+ $resource = array();
+ foreach ($e->getPaths() as $path) {
+ $resource[] = new FileExistenceResource($path);
+ }
+
+ return;
+ }
+ $resource = new GlobResource($prefix, $pattern, $recursive);
+
+ foreach ($resource as $path => $info) {
+ yield $path => $info;
+ }
+ }
+
+ private function doImport($resource, $type = null, $ignoreErrors = false, $sourceResource = null)
{
try {
$loader = $this->resolve($resource, $type);
throw $e;
}
- throw new FileLoaderLoadException($resource, $sourceResource, null, $e);
+ throw new FileLoaderLoadException($resource, $sourceResource, null, $e, $type);
}
}
}