Cargando recursos

Localizando recursos

La carga de la configuración normalmente se inicia con la búsqueda de recursos, en la mayoría de los casos: archivos. Esto se puede hacer con el Symfony\Component\Config\FileLocator:

use Symfony\Component\Config\FileLocator;

$configDirectories = array(__DIR__.'/app/config');

$locator = new FileLocator($configDirectories);
$yamlUserFiles = $locator->locate('users.yml', null, false);

El localizador recibe un conjunto de lugares donde se deben buscar los archivos. El primer argumento de locate() es el nombre del archivo a buscar. El segundo argumento puede ser la ruta actual y cuando si lo suministras, el localizador primero verá en ese directorio. El tercer argumento indica si el localizador debe devolver el primer archivo encontrado, o un arreglo conteniendo todas las coincidencias.

Cargadores de recursos

Debes definir un cargador para cada tipo de recurso (YAML, XML, anotaciones, etc.). Cada cargador debe implementar la Symfony\Component\Config\Loader\LoaderInterface o extender la clase abstracta Symfony\Component\Config\Loader\FileLoader, la cual permite la importación recursiva de otros recursos:

use Symfony\Component\Config\Loader\FileLoader;
use Symfony\Component\Yaml\Yaml;

class YamlUserLoader extends FileLoader
{
    public function load($resource, $type = null)
    {
        $configValues = Yaml::parse($resource);

        // ... manipula los valores de configuración

        // tal vez importe algún otro recurso:

        // $this->import('extra_users.yml');
    }

    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'yml' === pathinfo(
            $resource,
            PATHINFO_EXTENSION
        );
    }
}

Encontrando el cargador adecuado

La clase Symfony\Component\Config\Loader\LoaderResolver recibe como primer argumento el constructor de una colección de cargadores. Cuando se debe cargar un recurso (por ejemplo, un archivo XML), este realiza un bucle a través de esta colección de cargadores y devuelve el cargador compatible con ese tipo de recurso en particular.

La clase Symfony\Component\Config\Loader\DelegatingLoader usa el Symfony\Component\Config\Loader\LoaderResolver. Cuando se le pide que cargue un recurso, delega esta cuestión a la clase Symfony\Component\Config\Loader\LoaderResolver. En caso de que la resolución haya encontrado un cargador adecuado, se le pedirá a ese cargador que cargue el recurso:

use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Config\Loader\DelegatingLoader;

$loaderResolver = new LoaderResolver(array(new YamlUserLoader($locator)));
$delegatingLoader = new DelegatingLoader($loaderResolver);

$delegatingLoader->load(__DIR__.'/users.yml');
/*
El YamlUserLoader se utiliza para cargar este recurso,
debido a que es compatible con la extensión de archivo
".yml"
*/
Bifúrcame en GitHub