Documentação do Symfony - versão 3.4
Renderizada do repositório symfony-docs-pt-BR no Github
Cada aplicação é a combinação de código e um conjunto de configurações que
dita como o código deve funcionar. A configuração pode: definir o banco de
dados a ser utilizado, se algo deve ou não ser armazenado em cache, ou como
deve ser a verbosidade do log. No Symfony2, a idéia de “ambientes” é a idéia de que
a mesma base de código pode ser executada usando várias configurações diferentes. Por
exemplo, o ambiente dev deve usar uma configuração que faça com que o desenvolvimento
seja fácil e amigável, enquanto o ambiente prod deve usar um conjunto de configurações
otimizada para a velocidade.
Uma aplicação típica do Symfony2 começa com três ambientes: dev,
prod e test. Como discutido, cada “ambiente” simplesmente representa
uma forma de executar o mesmo código com configurações diferentes. Não deve
ser nenhuma surpresa, então, que cada ambiente carrega seu arquivo de configuração
individual. Se você estiver usando o formato de configuração YAML, os seguintes arquivos
são usados:
dev: app/config/config_dev.ymlprod: app/config/config_prod.ymltest: app/config/config_test.ymlIsso funciona por meio de uma convenção simples que é usada, por padrão, dentro da classe
AppKernel:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // app/AppKernel.php
// ...
class AppKernel extends Kernel
{
// ...
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}
}
|
Como você pode ver, quando o Symfony2 é carregado, ele usa um dado ambiente para determinar qual arquivo de configuração deve carregar. Isto alcança o objetivo de vários ambientes de uma forma elegante, poderosa e transparente.
É claro que, na realidade, cada ambiente só difere um pouco dos outros. Geralmente, todos os ambientes irão compartilhar uma grande base de configuração comum. Abrindo o arquivo de configuração “dev”, você pode ver como isso é feito fácil e transparentemente:
1 2 3 | imports:
- { resource: config.yml }
# ...
|
1 2 3 4 | <imports>
<import resource="config.xml" />
</imports>
<!-- ... -->
|
1 2 | $loader->import('config.php');
// ...
|
Para compartilhar as configurações comuns, cada arquivo de configuração de ambiente
simplesmente primeiro importa de um arquivo de configuração central (config.yml).
O restante do arquivo pode então desviar-se da configuração padrão
sobrescrevendo os parâmetros individuais. Por exemplo, por padrão, a barra de ferramentas
web_profiler está desativada. No entanto, no ambiente dev, a barra de ferramentas é
ativada, modificando o valor padrão no arquivo de configuração dev:
1 2 3 4 5 6 7 | # app/config/config_dev.yml
imports:
- { resource: config.yml }
web_profiler:
toolbar: true
# ...
|
1 2 3 4 5 6 7 8 | <!-- app/config/config_dev.xml -->
<imports>
<import resource="config.xml" />
</imports>
<webprofiler:config
toolbar="true"
... />
|
1 2 3 4 5 6 7 | // app/config/config_dev.php
$loader->import('config.php');
$container->loadFromExtension('web_profiler', array(
'toolbar' => true,
...,
));
|
Para executar a aplicação em cada ambiente, carregue a aplicação usando
o front controller app.php (para o ambiente prod) ou o app_dev.php
(para o ambiente dev):
1 2 | http://localhost/app.php -> *prod* environment
http://localhost/app_dev.php -> *dev* environment
|
Note
As URLs fornecidas assumem que o seu servidor web está configurado para usar o diretório
web/ da aplicação como sua raiz. Leia mais em
Installing Symfony2.
Se você abrir um desses arquivos, verá rapidamente que o ambiente utilizado por cada um é definido explicitamente:
1 2 3 4 5 6 7 8 9 | <?php
require_once __DIR__.'/../app/bootstrap_cache.php';
require_once __DIR__.'/../app/AppCache.php';
use Symfony\Component\HttpFoundation\Request;
$kernel = new AppCache(new AppKernel('prod', false));
$kernel->handle(Request::createFromGlobals())->send();
|
Como você pode ver, a chave prod especifica que esse ambiente será executado
no ambiente prod. Uma aplicação Symfony2 pode ser executada em qualquer
ambiente usando este código e alterando a string de ambiente.
Note
O ambiente test é utilizado quando escrevemos testes funcionais e não é
acessível diretamente no navegador através de um front controller. Em outras
palavras, ao contrário dos outros ambientes, não há um arquivo
front controller app_test.php.
Por padrão, uma aplicação Symfony2 tem que lidar com três ambientes na maioria dos casos. Claro, desde que um ambiente nada mais é do que uma string que corresponde a um conjunto de configuração, a criação de um novo ambiente é bastante fácil.
Suponha, por exemplo, que antes da implantação, você precisa realizar um benchmark da sua
aplicação. Uma forma de realizar o benchmark da aplicação é usar configurações próximas da
produção, mas com o web_profiler do Symfony2 habilitado. Isto permite ao Symfony2
registrar as informações sobre sua aplicação enquanto o realiza o benchmark.
A melhor forma de realizar isto é através de um novo ambiente chamado, por exemplo,
benchmark. Comece por criar um novo arquivo de configuração:
1 2 3 4 5 6 | # app/config/config_benchmark.yml
imports:
- { resource: config_prod.yml }
framework:
profiler: { only_exceptions: false }
|
1 2 3 4 5 6 7 8 | <!-- app/config/config_benchmark.xml -->
<imports>
<import resource="config_prod.xml" />
</imports>
<framework:config>
<framework:profiler only-exceptions="false" />
</framework:config>
|
1 2 3 4 5 6 | // app/config/config_benchmark.php
$loader->import('config_prod.php')
$container->loadFromExtension('framework', array(
'profiler' => array('only-exceptions' => false),
));
|
E com esta simples adição, a aplicação agora suporta um novo ambiente
chamado benchmark.
Este novo arquivo de configuração importa a configuração do ambiente prod
e modifica ela. Isso garante que o novo ambiente é idêntico ao
ao ambiente prod, exceto por quaisquer alterações explicitamente feitas aqui.
Já que você deseja que este ambiente seja acessível através de um navegador, você
também deve criar um front controller para ele. Copie o arquivo web/app.php
para web/app_benchmark.php e edite o ambiente para benchmark:
1 2 3 4 5 6 7 8 9 | <?php
require_once __DIR__.'/../app/bootstrap.php';
require_once __DIR__.'/../app/AppKernel.php';
use Symfony\Component\HttpFoundation\Request;
$kernel = new AppKernel('benchmark', false);
$kernel->handle(Request::createFromGlobals())->send();
|
O novo ambiente está agora acessível através:
http://localhost/app_benchmark.php
Note
Alguns ambientes, como o ambiente dev, nunca são destinados ao
acesso em qualquer servidor implantado para o público em geral. Isto é porque
certos ambientes, para fins de depuração, podem fornecer muita informação
sobre a aplicação ou a infra-estrutura subjacente. Para ter certeza que estes ambientes
não são acessíveis, o front controller é normalmente protegido de endereços IP externos
através do seguinte código no topo do controlador:
1 2 3 if (!in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1'))) { die('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.'); }
O Symfony2 aproveita o cache de muitas maneiras: para a configuração da aplicação, configuração de roteamento, templates Twig e mais é realizado o cache para objetos PHP armazenados em arquivos no sistema de arquivos.
Por padrão, esses arquivos em cache são armazenados, em grande parte, no diretório app/cache.
No entanto, cada ambiente armazena seu próprio conjunto de arquivos:
1 2 | app/cache/dev - diretório cache para o ambiente *dev*
app/cache/prod - diretório cache para o ambiente *prod*
|
Às vezes, quando depurando, pode ser útil inspecionar um arquivo em cache para
compreender como algo está funcionando. Ao fazê-lo, lembre-se de olhar no
diretório do ambiente que você está usando (mais comumente dev enquanto estiver
desenvolvendo e depurando). Embora possa variar, o diretório app/cache/dev
inclui o seguinte:
appDevDebugProjectContainer.php - o “container de serviço” em cache que
representa a configuração da aplicação em cache;appdevUrlGenerator.php - a classe PHP gerada a partir da configuração
de roteamento e usada ao gerar URLs;appdevUrlMatcher.php - a classe PHP usada para correspondência de rota - olhe
aqui para ver a lógica de expressões regulares compiladas usadas para correspondência das URLs de
entrada para diferentes rotas;twig/ - Este diretório contém todos templates Twig em cache.Note
Você pode facilmente mudar a localização do diretório e o seu nome. Para mais informações leia o artigo /cookbook/configuration/override_dir_structure.
Leia o artigo em /cookbook/configuration/external_parameters.