Symfony 4: Monolito vs Micro

Esta é a segunda parte de uma série de artigos sobre o Symfony 4. O primeiro foi sobre as limitações atuais do modelo de Distribuição do Symfony.

Projetos monolíticos versus micro-aplicações: um debate sem fim. O Symfony é compatível com ambos. Mesmo a Edição Standard do Symfony sendo provavelmente mais adequada para projetos monolíticos, pois depende do pacote symfony/symfony. Esse meta-pacote contém todos os componentes do Symfony e alguns bundles do “núcleo”. Entre outros recursos, você obtém o Twig e o Web Profiler. Mas, tecnicamente, eles não são necessários se você estiver desenvolvendo uma API para a sua próxima aplicação móvel.

Claro, alguns arquivos extras sob o diretório vendor/ não mudam nada, mas alguns desenvolvedores pensam que suas aplicações são mais “inchadas” por causa desses bits extras no disco. Parece que esses recursos extras não utilizados tornam a sua aplicação pesada. Isso é sobretudo percepção.

O Silex utiliza outra abordagem onde cada componente individual é exigido apenas quando necessário. Isso torna o Silex mais simples, leve ou mais rápido do que o Symfony? Não. No entanto, o Symfony 4 será mais semelhante ao Silex nesse aspecto.

As aplicações Symfony são mínimas

Sem mais dependência no symfony/symfony. Uma aplicação Symfony agora dependerá dos componentes e pacotes individuais do Symfony. Essa é provavelmente a mudança mais significativa na forma como você irá desenvolver aplicações com o Symfony 4. O principal motivo não é porque ele ajuda a reduzir o número de arquivos sob vendor/. Mas porque abre muitas outras ótimas oportunidades.

Isso ajuda com a configuração automática, um dos principais recursos do Symfony 4. Ao instalar um bundle, o Symfony agora irá configurá-lo automaticamente com bons padrões. A configuração também se adapta de acordo com suas outras dependências.

Pegue o Bundle do Framework Symfony como exemplo. Alguns recursos podem ser ativados ou desativados, como formulário, validação, templates, serializador, assets, …

A partir do Symfony 3.2, o suporte aos formulários está habilitado por padrão, mas você pode desativá-lo se não o estiver usando na sua aplicação. Por que é habilitado por padrão? Porque não há nenhuma maneira do Symfony saber se você usará formulários em sua aplicação. Desativá-lo por padrão levaria a uma experiência de desenvolvimento ligeiramente pior, pois essa é uma configuração para ajustar antes de seu primeiro formulário funcionar.

Agora, imagine uma aplicação onde symfony/symfony não é uma dependência. Uma aplicação pode começar apenas com symfony/framework-bundle. Habilitar automaticamente o suporte aos formulários agora é trivial: ative-o quando o symfony/form for instalado, desative-o caso contrário. Simples, sem magia, sem configuração, excelente experiência para o desenvolvedor. Você vai adorar o Symfony 4.

Como um ótimo efeito colateral, o desempenho é melhor, pois os recursos opcionais são desativados automaticamente. Sem ajustes em arquivos de configuração. Serão compartilhados alguns benchmarks simples em outro post.

Ser mínimo também significa que o Symfony não tenta fazer mais suposições quanto ao seu stack. Além da remoção dos arquivos LICENSE ou README no esqueleto, não há mais arquivos .htaccess do Apache. E se você estiver usando o Apache então? Bem, será necessário esperar por outro post para obter a resposta, mas você terá cobertura.

Composição

A remoção da dependência symfony/symfony ajuda com outro recurso do Symfony 4: descoberta automática e remoções de dependências. A composição foi mencionada no post anterior. O Symfony 4 usará essas dependências menores para ajudá-lo a compor as suas aplicações.

Deseja usar formulários? Adicione symfony/form. Quer usar o servidor web embutido no PHP? Adicione symfony/web-server-bundle. Aprimoramento progressivo. Adicione dependências somente quando necessário.

Juntamente com a configuração automática, é muito poderoso. Não precisa mais do servidor web embutido? Remova o pacote symfony/web-server-bundle. O Symfony cuida de remover a configuração do bundle.

Esse é um exemplo muito simples, mas há mais. Vamos ilustrar o poder desse novo paradigma com o SensioDistributionBundle, um bundle exigido por padrão na Edição Standard do Symfony.

Você não acha que as verificações de requisitos atualmente são implementadas estranhamente? Os arquivos são copiados do bundle para a Edição Standard no lançamento. Você é responsável por removê-los antes da implantação (especialmente web/config.php).

Toda a lógica foi movida para symfony/requirements-checker. Deseja verificar os requisitos? Adicione o pacote com o Composer. Execute os scripts. Corrija quaisquer problemas. Desinstale o pacote quando terminar. Os arquivos são adicionados e removidos automaticamente.

Outra característica principal do SensioDistributionBundle é poder executar alguns comandos quando você executa composer install ou composer update: eles gerenciam o arquivo bootstrap (que não é mais necessário com o PHP 7), limpam o cache e instalam os assets. Parece uma lógica de código fixo (veja a chamada Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::* no arquivo composer.json do seu projeto). O conceito foi reformulado para o Symfony 4 de uma maneira extensível. Você pode ajustar e adicionar seus próprios comandos e lógica.

Não haverá uma versão SensioDistributionBundle compatível com o Symfony 4. Não precisamos de uma. Você pode pensar no Symfony Flex como o sucessor dele. Uma versão mais simples e poderosa dele.

Aplicações sem Bundles

Quando foi escrita a primeira versão das melhores práticas do Symfony, houve um longo debate sobre a promoção de “aplicações de um único bundle” versus “aplicações sem bundles”. Foi decidido seguir com um único bundle AppBundle para evitar uma interrupção muito grande, mas também porque o Symfony não estava pronto para suportar aplicações sem bundles como cidadãos de primeira classe. Mas durante os últimos meses foi trabalhado muito para garantir que o Symfony 4 possa permitir aplicações sem bundle.

Portanto, o Symfony 4 irá recomendar e gerar aplicações sem bundle. Não há mais bundles em seu código, basta usar App\ como um namespace para qualquer classe em src/. Isso reduz a complexidade percebida. E também faz seu código parecer mais desacoplado do Symfony. Não acho que as aplicações devem desacoplar 100% o seu código do framework subjacente, mas, a partir do Symfony 3.3, muitos recursos o ajudam a fazer isso.

Aplicações sem bundle são apenas uma das mudanças de melhores práticas para o Symfony 4. As melhores práticas são o tópico da próxima publicação.

Tradução do artigo original publicado por Fabien PotencierSymfony 4: Monolith vs Micro