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
:
<?phpnamespace 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:
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 Potencier “Symfony 4: A quick Demo”