Documentação do Symfony - versão 3.1
Renderizada do repositório symfony-docs-pt-BR no Github
A seção /cookbook/configuration/environments explicou o básico sobre como o Symfony utiliza ambientes para executar a sua aplicação com diferentes definições de configuração. Esta seção irá explicar um pouco mais em profundidade o que acontece quando sua aplicação é inicializada. Para entender esse processo, você precisa entender três partes que funcionam em conjunto:
Note
Normalmente, você não precisará definir seu próprio front controller ou
classe AppKernel
pois a Edição Standard do Symfony fornece
implementações padrão coerentes.
Esta seção de documentação é fornecida para explicar o que está acontecendo nos bastidores.
O front controller é um padrão de projeto bem conhecido; é uma parte de código por onde todas as requisições servidas por uma aplicação passam.
Na Edição Standard do Symfony, esse papel é feito pelos arquivos app.php
e app_dev.php que estão no diretório web/
. Esses são os primeiros
scripts PHP executados quando uma requisição é processada.
O principal objetivo do front controller é criar uma instância do
AppKernel
(mais sobre isso em um segundo), fazê-lo lidar com a requisição
e retornar a resposta resultante para o navegador.
Uma vez que cada requisição é encaminhada através dele, o front controller pode ser usado para executar a inicialização global, antes de configurar o kernel ou para `decorar`_ o kernel com recursos adicionais. Os exemplos incluem:
O front controller pode ser escolhido ao requisitar as URLs da seguinte forma:
1 | http://localhost/app_dev.php/some/path/...
|
Como você pode ver, essa URL contém o script PHP para ser usado como front
controller. Você pode usar isso para mudar facilmente o front controller ou usar
um personalizado colocando-o no diretório web/
(ex. app_cache.php
).
Ao usar o Apache e o RewriteRule que vem com a Edição Standard do Symfony,
você pode omitir o nome do arquivo na URL e o RewriteRule irá usar app.php
como padrão.
Note
Praticamente todos os outros servidores web devem ser capazes de obter um comportamento semelhante ao do RewriteRule descrito acima. Verifique a documentação do seu servidor para obter mais detalhes ou veja /cookbook/configuration/web_server_configuration.
Note
Certifique-se de que você protegeu adequadamente seus front controllers contra acesso não autorizado. Por exemplo, você não quer fazer ter um ambiente de depuração disponível para usuários arbitrários em seu ambiente de produção.
Tecnicamente, o script bin/console utilizado ao executar o Symfony na linha de comando também é um front controller, mas apenas não é usado para web, mas sim para requisições de linha de comando.
A Kernel
é o núcleo do
Symfony. Ela é responsável por configurar todos os bundles que compõem
sua aplicação e fornecer a eles a configuração da aplicação.
Em seguida, ela cria o container de serviço antes de servir as requisições em seu
método handle()
.
Existem dois métodos declarados na
KernelInterface
que
não foram implementados em Kernel
e, assim, servem como template methods:
registerBundles()
registerContainerConfiguration()
Para preencher esses (pequenos) espaços em branco, sua aplicação precisa criar uma subclasse do
Kernel e implementar esses métodos. A classe resultante é convencionalmente
chamada de AppKernel
.
Mais uma vez, a Edição Standard do Symfony fornece um AppKernel no diretório
app/
. Essa classe usa o nome do ambiente - que é passado para
o método construtor
do Kernel e está disponível via getEnvironment()
-
para decidir quais bundles criar. A lógica para isso está em registerBundles()
,
um método destinado a ser estendido por você quando você começar a adicionar bundles em sua
aplicação.
Você está, é claro, livre para criar suas próprias variantes do AppKernel
, alternativas
ou adicionais. Tudo o que você precisa é adaptar seu (ou adicionar um novo) front
controller para usar o novo kernel.
Note
O nome e a localização do AppKernel
não são fixos. Ao
colocar vários kernels em uma única aplicação,
pode fazer sentido adicionar sub-diretórios adicionais,
por exemplo app/admin/AdminKernel.php
e
app/api/ApiKernel.php
. Tudo o que importa é que seu front
controller seja capaz de criar uma instância do kernel apropriada.
Ter AppKernels
diferentes pode ser útil para habilitar diferentes front
controllers (em potencialmente diferentes servidores) para executar partes da sua aplicação
independentemente (por exemplo, UI administrador, UI front-end e migrações de banco de dados).
Note
Há muito mais no que o AppKernel
pode ser usado, por exemplo
sobrescrever a estrutura de diretório padrão.
Mas as probabilidades são altas de que você não necessite mudar coisas como essa em
tempo real ao ter várias implementações AppKernel
.
Como já mencionado, o AppKernel
tem que implementar outro método -
registerContainerConfiguration()
.
Esse método é responsável por carregar a configuração da aplicação
a partir do ambiente correto.
Ambientes foram cobertos extensivamente
no capítulo anterior,
e você provavelmente lembra que a Edição Standard Symfony vem com três
deles - dev
, prod
e test
.
Mais tecnicamente, esses nomes são nada mais do que strings passadas do
front controller para o construtor do AppKernel
. Esse nome pode então ser
utilizado no método registerContainerConfiguration()
para decidir quais arquivos de configuração carregar.
A classe AppKernel da Edição Standard do Symfony implementa esse método ao
simplesmente carregar o arquivo app/config/config_*environment*.yml
. Você está, evidentemente,
livre para implementar esse método de forma diferente caso precisar de uma forma mais sofisticada
para carregar a sua configuração.