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.
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
);
}
}
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"
*/