Symfony 4: Uma Demonstração Rápida

Hora de testar o Symfony 4… ou, pelo menos, vamos testar a experiência do desenvolvimento de projetos Symfony 4 com o Symfony 3.3. Tenha em mente que todas as ferramentas estão no modo visualização. Os recursos podem evoluir ao longo do tempo. A primeira versão estável do Symfony Flex não será lançada antes do Symfony 4, no final de novembro de 2017. Isso possibilita à comunidade bastante tempo para discutir as mudanças descritas nesta série de postagens no blog sobre o Symfony 4.

Criando um novo projeto

O primeiro passo é criar um projeto. Atualmente, isso precisa ser feito via composer create-project. Podemos lançar uma ferramenta para inicializar um projeto mais rápido.

Vamos:

composer create-project "symfony/skeleton:^3.3" demo
cd demo

3.3 é a única versão atualmente disponível e usa o Symfony 3.3. Versões como 4.0, lts, ou latest estarão disponíveis mais tarde (mas não antes do lançamento da versão do Symfony 4.0, é claro).

O comando faz o download do esqueleto do Symfony, que consiste apenas de um arquivo composer.json.

Em seguida, ele extrai o arquivo no diretório demo e executa automaticamente composer install. symfony/flex é o primeiro pacote a ser instalado para que ele possa se conectar ao processo do Composer. Quando o Composer instala (ou atualiza) outras dependências, o Symfony Flex procura uma receita associada no servidor Symfony Flex e a executa. Você pode ver o Symfony Flex em ação através dos logs que ele adiciona à saída do Composer.

Quando terminar, você deve ver uma seção “ What’s next?” que explica os próximos passos possíveis, como executar make serve para iniciar o servidor web interno do PHP. Antes de avançarmos, vá até o diretório do projeto: cd demo.

serve é uma das tarefas adicionadas ao Makefile local, conforme descrito na receita symfony/framework-bundl.

Observe que alguns comandos foram instalados e executados automaticamente no final do processo:

Novamente, esses scripts foram adicionados ao arquivo composer.json do projeto conforme definido pela receita symfony/framework-bundle. O segundo script não foi executado porque a ferramenta de console (disponível via symfony/console) não está instalada por padrão (veremos como “corrigir” esse problema mais tarde).

Agora é um bom momento para inicializar o Git:

git init
git add .
git commit -m "initial set of files"

Usar git add . funciona bem pois o Symfony teve o cuidado de criar um “bom” arquivo .gitignore.

Lembre-se de que o esqueleto tem apenas um arquivo, composer.json. Verifique o diretório demo/ agora; mais alguns arquivos foram criados. Esses arquivos foram adicionados pelo Symfony Flex com base nos pacotes instalados, conforme descrito em receitas.

Vamos examinar a estrutura do diretório agora. A maioria dos arquivos foi adicionada por causa da dependência symfony/framework-bundle.

O arquivo .env define as variáveis ​​de ambiente APP_ENV e APP_DEBUG:

###> symfony/framework-bundle ###
APP_ENV=dev APP_DEBUG=1 APP_SECRET=ODtvoHW6pn3bE2rHgTa2MjkjwefzlsJH ###< symfony/framework-bundle ###

Os comentários permitem que o Symfony Flex “gerencie” essa seção. Isso é útil quando essas variáveis ​​precisam ser removidas no momento que o pacote é removido. Se você remover os comentários, o Symfony Flex não poderá mais gerenciar essas variáveis ​​automaticamente. Dê uma olhada em .gitignore para um exemplo semelhante.

Se você tiver curiosidade, verifique web/index.php, o novo front controller web.

Os arquivos mais interessantes estão sob config/. Os pontos de entrada principais são os arquivos vazios container.yaml e routing.yaml; é aqui que você pode adicionar serviços, parâmetros, e rotas ao seu projeto. Uma configuração padrão também foi instalada para symfony/framework-bundle sob config/packages/. Sinta-se à vontade para ajustar os arquivos de configuração instalados ou adicionar mais arquivos conforme suas próprias necessidades.

Por último, mas não menos importante, FrameworkBundle está agora registrado em bundles.php:

return [
'Symfony\Bundle\FrameworkBundle\FrameworkBundle' => ['all' => true],
];

Mesmo que um bundle não tenha uma receita, o Symfony detecta os pacotes Composer com o tipo symfony-bundle e os habilita automaticamente para todos os ambientes. Isso evita a criação de receitas quando o registro é apenas uma questão de habilitar o bundle.

O diretório src/ é onde você pode armazenar suas classes PHP. Sob o namespace App\ como registrado em composer.json. Note que é onde o Kernel.php também foi instalado como App\Kernel.

Agora, é hora de instalar algumas novas dependências através do Composer. Vamos começar adicionando um servidor web mais poderoso ao seu projeto:

composer req webserver

E instale suporte ao console do Symfony via:

composer req cli

Nota: req é um atalho para require (a CLI do Composer suporta qualquer atalho que não seja ambíguo, use rem para remover um Pacote).

webserver é um alias para symfony/web-server-bundle, e cli é um alias para symfony/console. Isso funciona porque o Symfony Flex sabe como converter esses alias em nomes de pacotes completos: cli é equivalente a console, que equivale a symfony/console. O prefixo symfony/ é sempre opcional. Tente composer req workflow or composer req ldap. web-server-bundle é muito complicado, então use webserver ou apenas server.

Para as dependências do Symfony, o Symfony Flex também reconhece algumas versões a mais do que as habituais do Composer, principalmente next, previous, lts, e stable (nem todas funcionam ainda).

composer req cli:next

Após executar composer req cli, observe como o comando assets:install executou automaticamente. O arquivo bin/console também foi adicionado ao seu projeto.

Os alias também funcionam ao remover a dependência:

composer rem cli

… que também remove o binário bin/console (por diversão, experimente isso: composer rem framework-bundle).

Lembra que foi escrito sobre a experiência do desenvolvedor ao instalar um bundle do Symfony? Vamos agora instalar algo realmente “complexo” como um gerador admin que usa o Doctrine como base. Quantas etapas para fazê-lo funcionar? Pode ser menos do que você espera, e definitivamente mais divertido.

Primeiro, vamos instalar o EasyAdminBundle:

composer req admin

Além de instalar o bundle do gerador admin, ele também instala todas as suas dependências transitivas e as configura automaticamente : TwigBundle, SecurityBundle, FrameworkExtraBundle, e DoctrineBundle.

admin é uma palavra “genérica”. É por isso que foi escrito sobre as receitas do Symfony Flex serem opinativas. Só pode haver um pacote com alias admin. orm é outra palavra genérica que atualmente é o alias do ORM Doctrine.

Execute o servidor web interno do PHP através de make serve or bin/console server:start e vá para http://localhost:8000/admin/. Você deve obter um erro, pois ainda não existem entidades do Doctrine. Vamos criar uma em src/Entity/Product.php:

<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="product")
*/
class Product {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
    /**
* @ORM\Column(type="string", length=100)
*/
public $name;
    /**
* @ORM\Column(type="decimal", scale=2)
*/
public $price;
    /**
* @ORM\Column(type="text")
*/
public $description;
}

Ajuste a configuração do banco de dados em .env:

###> doctrine/doctrine-bundle ###
DATABASE_URL=mysql://root@127.0.0.1:3306/symfony?charset=utf8mb4
###< doctrine/doctrine-bundle ###

Execute os seguintes comandos para inicializar o banco de dados:

./bin/console doctrine:database:create
./bin/console doctrine:schema:update --force

Finalmente, adicione a entidade Product à lista de entidades gerenciadas pelo gerador admin (config/packages/easy_admin.yaml):

easy_admin:
entities:
- App\Entity\Product

Tente http://localhost:8000/admin/ novamente. Se tudo ocorreu bem, você poderá gerenciar produtos.

Em vez de instalar um gerador admin, dê uma olhada neste pequeno screencast onde está sendo usado o alias api para inicializar um projeto de API de forma rápida e fácil:

Symfony Flex em ação para criar um projeto de API

Aqui estão alguns alias interessantes ​​que você pode tentar:

  • sec-checker para instalar o SensioLabs Security Checker;
  • req-checker para instalar as verificações de requisitos do Symfony;
  • log para instalar o MonologBundle e todas as suas dependências;
  • template para o Twig;
  • mailer para o Swiftmailer;
  • profiler para o profiler;
  • … você entendeu :)

Como symfony/symfony não é mais necessário, você obtém dependências mais granulares, mas pode ser complicado instalar um a um cada componente Symfony. Para aliviar a dor, estamos experimentando um novo conceito: “packs”. Um pack é nada mais do que um repositório Git regular registrado no Composer que contém um composer.json que faz referência a um conjunto de pacotes relacionados. Como exemplo, foi criado um pack debug-pack que pode ser instalado via composer req debug-pack. Dê uma olhada no ORM pack ou o API pack. Imagine um web-pack que não faz referência a nada no composer.json, mas está associado a uma receita que instala um conjunto de arquivos padrão sob public/ como favicons, um robots.txt, e assim por diante. Agradável? Imagine o mesmo para Travis, Blackfire ou Docker. Ou um pack que instala exatamente as mesmas dependências que a atual Edição Standard do Symfony? Sua imaginação é o limite. Componha as suas aplicações com pacotes, packs e suas receitas associadas.

O Symfony Flex permite a composição distribuída ao invés de herança. A nova forma é mais fácil, flexível, e poderosa ao mesmo tempo.

A primeira versão do servidor Symfony Flex é bastante simples, mas ao longo do tempo, mais recursos serão implementados.

Agora, provavelmente é hora de você escrever algum código. Que tal alguns controladores e templates? Aguente. Mesmo podendo fazer o que está acostumado, o Symfony 3.3 e o Symfony 4.0 propõem uma experiência muito mais suave que você poderá gostar mais. Esse é um tópico excelente para o próximo post sobre o Symfony 4.

Lembrando que os repositórios de receitas em https://github.com/symfony/recipes e https://github.com/symfony/recipes-contrib são públicos agora. Tenha em mente que o conteúdo é experimental. As opções atuais podem mudar.

Tradução do artigo original publicado por Fabien PotencierSymfony 4: A quick Demo