Como criar um handler de configuração para carregar um arquivo YML personalizado no Simfony

Esses dias estive estudando sobre o handler de configuração do Symfony, o Symfony tem uns recursos bem bacanas que acabamos não utilizando por falta de conhecimento, pois normalmente estamos acostumados a fazer tudo com o arroz e feijão. Mas o Symfony tem uns acompanhamentos interessantes para fazermos uma mistura legal, e o sistema de Handler de configuração é uma delas.

Vamos criar um arquivo com extensão YML que irá conter algumas variáveis, essas variáveis aqui serão declaradas manualmente, mas a idéia é gerar o arquivo yml automaticamente através de um evento qualquer e salvar no arquivo as variáveis de configuração vindas do banco de dados.

Deixaremos essas configurações do arquivo com acesso disponíveis através da classe sfConfig.

Passos:

1) Crie o arquivo variables.yml.

# touch /apps/frontend/config/variables.yml

Edite o arquivo e defina manualmente as nossas variáveis:


# variables
all:
test1: value1
test2: value2

2) Agora vamos definir o arquivo config_handlers que será carregado automaticamente com as demais configurações do Symfony.

# touch /apps/frontend/config/config_handlers.yml

Edite o arquivo e defina a classe (sfDefineEnvironmentConfigHandler) para que as variáveis fiquem disponíveis no ambiente e acessíveis através do sfConfig. Também definimos um prefixo (var) para todas nossas variáveis.


config/variables.yml:
class: sfDefineEnvironmentConfigHandler
param:
prefix: var_

3) Agora alteramos o arquivo responsável por carregar todas as configurações da aplicação para fazer a chamada ao nosso arquivo variables.yml

Edite o arquivo /apps/frontend/config/frontendConfiguration.class.php


public function configure()
{
include( $this->getConfigCache()->checkConfig('config/variables.yml') );
}

Agora limpe o cache e faça o teste;

sfConfig::get('var_test1', 'não funcionou'); //output: value1

Você pode verificar todas as variáveis disponíveis através do web_debug toolbar, as nossas variáveis ficam na sessão settings da barra:


settings:
......
sf_app: frontend
sf_app_base_cache_dir: /home/nei/projetos/wr/trunk/cache/frontend
sf_app_cache_dir: /home/nei/projetos/wr/trunk/cache/frontend/dev
var_test1: value1
var_test2: value2
......

No meu caso que tenho um model chamado Variable, posso adicionar no model uma trigger para gerar esse arquivo variables.yml sempre que houver alteração no model.

Aqui tem um exemplo de como trabalhar com yml.

A utilidade para este recurso é enorme, saiba o momento certo de utilizar.