forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			127 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?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\Loader;
 | 
						|
 | 
						|
use Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException;
 | 
						|
use Symfony\Component\Config\Exception\FileLoaderLoadException;
 | 
						|
use Symfony\Component\Config\FileLocatorInterface;
 | 
						|
 | 
						|
/**
 | 
						|
 * FileLoader is the abstract class used by all built-in loaders that are file based.
 | 
						|
 *
 | 
						|
 * @author Fabien Potencier <fabien@symfony.com>
 | 
						|
 */
 | 
						|
abstract class FileLoader extends Loader
 | 
						|
{
 | 
						|
    protected static $loading = array();
 | 
						|
 | 
						|
    protected $locator;
 | 
						|
 | 
						|
    private $currentDir;
 | 
						|
 | 
						|
    public function __construct(FileLocatorInterface $locator)
 | 
						|
    {
 | 
						|
        $this->locator = $locator;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Sets the current directory.
 | 
						|
     *
 | 
						|
     * @param string $dir
 | 
						|
     */
 | 
						|
    public function setCurrentDir($dir)
 | 
						|
    {
 | 
						|
        $this->currentDir = $dir;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the file locator used by this loader.
 | 
						|
     *
 | 
						|
     * @return FileLocatorInterface
 | 
						|
     */
 | 
						|
    public function getLocator()
 | 
						|
    {
 | 
						|
        return $this->locator;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Imports a resource.
 | 
						|
     *
 | 
						|
     * @param mixed       $resource       A Resource
 | 
						|
     * @param string|null $type           The resource type or null if unknown
 | 
						|
     * @param bool        $ignoreErrors   Whether to ignore import errors or not
 | 
						|
     * @param string|null $sourceResource The original resource importing the new resource
 | 
						|
     *
 | 
						|
     * @return mixed
 | 
						|
     *
 | 
						|
     * @throws FileLoaderLoadException
 | 
						|
     * @throws FileLoaderImportCircularReferenceException
 | 
						|
     */
 | 
						|
    public function import($resource, $type = null, $ignoreErrors = false, $sourceResource = null)
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $loader = $this->resolve($resource, $type);
 | 
						|
 | 
						|
            if ($loader instanceof self && null !== $this->currentDir) {
 | 
						|
                // we fallback to the current locator to keep BC
 | 
						|
                // as some some loaders do not call the parent __construct()
 | 
						|
                // @deprecated should be removed in 3.0
 | 
						|
                $locator = $loader->getLocator();
 | 
						|
                if (null === $locator) {
 | 
						|
                    @trigger_error('Not calling the parent constructor in '.\get_class($loader).' which extends '.__CLASS__.' is deprecated since Symfony 2.7 and will not be supported anymore in 3.0.', E_USER_DEPRECATED);
 | 
						|
                    $locator = $this->locator;
 | 
						|
                }
 | 
						|
 | 
						|
                $resource = $locator->locate($resource, $this->currentDir, false);
 | 
						|
            }
 | 
						|
 | 
						|
            $resources = \is_array($resource) ? $resource : array($resource);
 | 
						|
            for ($i = 0; $i < $resourcesCount = \count($resources); ++$i) {
 | 
						|
                if (isset(self::$loading[$resources[$i]])) {
 | 
						|
                    if ($i == $resourcesCount - 1) {
 | 
						|
                        throw new FileLoaderImportCircularReferenceException(array_keys(self::$loading));
 | 
						|
                    }
 | 
						|
                } else {
 | 
						|
                    $resource = $resources[$i];
 | 
						|
                    break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            self::$loading[$resource] = true;
 | 
						|
 | 
						|
            try {
 | 
						|
                $ret = $loader->load($resource, $type);
 | 
						|
            } catch (\Exception $e) {
 | 
						|
                unset(self::$loading[$resource]);
 | 
						|
                throw $e;
 | 
						|
            } catch (\Throwable $e) {
 | 
						|
                unset(self::$loading[$resource]);
 | 
						|
                throw $e;
 | 
						|
            }
 | 
						|
 | 
						|
            unset(self::$loading[$resource]);
 | 
						|
 | 
						|
            return $ret;
 | 
						|
        } catch (FileLoaderImportCircularReferenceException $e) {
 | 
						|
            throw $e;
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            if (!$ignoreErrors) {
 | 
						|
                // prevent embedded imports from nesting multiple exceptions
 | 
						|
                if ($e instanceof FileLoaderLoadException) {
 | 
						|
                    throw $e;
 | 
						|
                }
 | 
						|
 | 
						|
                throw new FileLoaderLoadException($resource, $sourceResource, null, $e);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |