Primeiras aulas do curso Symfony Parte 3: Tratamento de erros, cache, logs e testes

Symfony Parte 3: Tratamento de erros, cache, logs e testes

Tratando erros da aplicação - Introdução

Olá, pessoal. Sejam muito bem-vindos à Alura. Meu nome é Vinicius Dias e vou guiar vocês nesse treinamento de Symfony, onde a gente vai continuar a construção de uma API restfull.

Nesse treinamento vamos falar sobre bastante coisa legal, uma dessas coisas é sobre como passar a tratar o erro de forma correta nas nossas aplicações. Não exibir um erro em html se nossa API devolve JSON.

Inclusive, ainda falando sobre erros. Vamos aprender a fazer log desses erros, fazer log dos eventos da nossa aplicação, como saber quando uma especialidade foi inserida, qual a especialidade, como rastrear esses eventos através dos logs, a gente vai entender a importância deles, inclusive vamos falar bem por alto sobre algumas ferramentas que nos ajudam a monitorar esses logs.

A gente vai falar sobre performance, vamos implementar um cache na nossa aplicação de forma que nem sempre quando a gente busca uma informação a gente precise ir no banco de dados. Vamos agilizar a buscar através de cache. Isso vai ser bem interessante.

Outro ponto que a gente vai bater bastante também é sobre testes. A gente já tem um treinamento sobre testes unitários na Alura, inclusive com php, mas dessa vez a gente foi um pouco além e fizemos testes de integração, dessa forma a gente consegue verificar que nosso sistema está todo funcionando. Requisições são feitas, dados são inseridos no banco de dados, e vamos utilizar técnicas bem legais para facilitar nossos testes.

No final de tudo, como um bônus, apesar de não ser um conteúdo de API, a gente acaba saindo com um template, com uma página html super linda, mas utilizando o twig, que é uma template muito poderosa, e a gente vê como é fácil estender o Symfony de forma que ele deixe de ser um micro framework para ser um framework full stack com todas as ferramentas necessárias para criar uma aplicação completa.

Esse treinamento está bem legal, tem bastante conteúdo, e já te reforço que se você acha que você vai aprender tudo que tem para saber sobre Symfony não é esse o treinamento. A gente dá muita informação, mas o Symfony é um ecossistema gigante, então aqui você vai ter ótimas direções, mas é impossível ensinar tudo em um único treinamento ou em dez treinamentos.

Espero que você aproveite o que a gente tem para ensinar. Caso durante o treinamento fique qualquer dúvida, não hesite, entre em contato pelo fórum, eu tento responder as dúvidas pessoalmente. Quando não consigo nossa comunidade é muito solicita. Alguém com certeza já passou pelo mesmo problema que você e talvez possa te ajudar.

Já aproveito para te convidar a entrar no Telegram do Symfony Brasil, é um grupo bastante amigável onde você pode tirar suas dúvidas e trocar ideias sobre Symfony. É só entrar no Telegram e digitar Symfony Brasil na pesquisa, é o primeiro grupo. Eu faço parte desse grupo, me dá um alô lá, diz que você entrou por causa desse treinamento, vai ser uma honra.

Espero que você aproveite o treinamento, te vejo no próximo vídeo para configurar nosso ambiente. Até lá.

Tratando erros da aplicação - Preparando o ambiente

Se você já fez os dois primeiros treinamentos de Symfony há pouco tempo pode pular esse vídeo e começar do próximo para dar continuidade ao treinamento. Agora, se você está começando pelo terceiro treinamento ou se já tem algum tempo que você fez os dois primeiros e não tem mais o projeto, quer reconfigurar, vem comigo que vamos fazer isso agora.

O primeiro passo é obviamente ter o php instalado. Nesse treinamento a gente usa o MYSQL como banco de dados, então você também precisa instalar o MYSQL. E a gente utiliza o composer para gerenciar nossas dependências. Com php, MYSQL e composer instalados, vamos começar o processo.

Primeiro, acessando o terminal, o prompt de comando na pasta do projeto, você vai executar composer install. Isso vai baixar todas as dependências, o Symfony, seus componentes, o que ele precisa para funcionar, e vai instalar no nosso projeto.

Enquanto vai baixando, a gente vai configurar nosso acesso ao banco de dados. Como falei, a gente utiliza o MYSQL nesse treinamento, e minha configuração usuário é root, senha é root, e estou com o banco de dados instalado na minha própria máquina. Então é local host.

Você vai modificar para o seu usuário que você configurou no MYSQL, a senha que você configurou no MYSQL e caso você tenha instalado na sua própria máquina vai manter local host.

Consultório Alura é o nome do banco de dados que a gente vai criar, você pode manter esse padrão. Vou pausar o vídeo e voltar quando todas as dependências tiverem sido instaladas.

Com todas as dependências instaladas, vamos configurar o banco de dados. Se você já fez os dois primeiros cursos, você já está utilizando o MYSQL, então não precisa fazer mais nenhuma configuração no php, mas se você acabou de instalar o php você vai precisar habilitar a extensão do MYSQL. Se você utiliza Linux ou Mac com um comando você já habilita essa extensão. Se você utiliza Windows você vai precisar ir na pasta que você extraiu os arquivos do php. Lá você vai achar o arquivo php.init.

Nesse arquivo você vai dar "Ctrl + F", pela extensão pdo_mysql. Essa linha você vai descomentar, remover o ponto e vírgula do início dela. Depois de salvar a gente vai digitar php bin console. Se você estiver no Linux ou no Mac é só bin console doctrine database create.

Isso vai criar o banco de dados. Depois, para configurar nosso esquema do banco de dados vamos rodar o bin console doctrine migrations migrate. Isso vai criar todas as nossas tabelas no banco de dados.

Ele pergunta se a gente tem certeza do que estamos fazendo, e a gente tem, então pronto. Projeto configurado com todas as dependências, banco de dados configurado com todas as tabelas criadas. Bora partir para o próximo vídeo, colocar a mão na massa e continuar nosso treinamento.

Tratando erros da aplicação - Eventos do Symfony

Bem-vindos de volta. Vamos falar um pouco sobre como tratar os erros da nossa aplicação, mas antes vamos ver que erros podem acontecer. Vamos subir a aplicação. Vou executar php -s localhost 8001 target public. Lembrando que esse comando sobe um servidor do php na minha própria máquina utilizando a porta 8001, pode ser outra, sem problema, e todas as requisições vão ser enviadas para a pasta public, o target vai ser a pasta public.

Vou dar enter, subi meu servidor. Vou utilizar o Postman para fazer os testes das minhas requisições. Abrindo o Postman, tenho alguns endpoints da minha API configurados, mas se você não tiver isso configurado não tem problema nenhum. Você vai tentar acessar localhost:8001/qualquer_coisa, e isso vai te mostrar muito provavelmente uma página mostrando um erro do tipo not found http. Ou seja, página não encontrada.

O que a gente quer fazer agora é fazer com que esse erro aqui não seja exibido em html, porque estamos criando uma API, o retorno da nossa API é em JSON, então os erros também precisam ser retornados em JSON, faz todo sentido, certo?

Primeiro, para a gente entender o que o Symfony faz aqui, quando a gente tenta acessar uma url que não existe ele lança uma exceção desse tipo. Ela por debaixo dos panos faz com que o status http seja alterado. Ótimo, é o que queremos, a gente quer que o status http seja 404, só que não quero que a página seja exibida em html.

O que eu preciso fazer é em algum lugar da minha aplicação pegar essa exceção, utilizando try catch ou qualquer ferramenta, e retornar esse erro de rota não encontrada em JSON, utilizando o hyper midia response, por exemplo. A gente pode fazer isso. Vamos pensar no que fazer.

O Symfony trabalha com eventos. Sempre que uma exceção é lançada o Symfony emite um evento que pode ser tratado utilizando listeners ou subscribers. Basicamente a diferença entre um listener e um subscriber é que um subscriber sabe exatamente que evento ele está ouvindo, porque a gente define no próprio subscriber o evento que ele vai ouvir. Já no listener a gente simplesmente define um método e o nome do método bate com o evento lançado.

Eu prefiro a abordagem do subscriber, então é ela que a gente vai implementar agora. A gente vai criar uma classe que escuta o evento de exception do Symfony, ou seja, um evento lançado quando uma exceção, que é emitido quando uma exceção é lançada, e ninguém trata essa exceção, e vamos criar um método na nossa classe que pega esse evento e define a resposta dessa requisição como resposta em JSON. Vamos implementar para entender como isso vai ficar.

Vou criar uma nova classe dentro de src, e essa classe vai ficar dentro de event listeners. Vou chamar de exception handler, que é tratador de exceções. Essa classe vai implementar o event subscrever interface.

O php stormy já me dá uma dica de que está faltando alguma coisa. Se você não estiver utilizando o php stormy é só importar essa interface e implementar utilizando php.

Com o php stormy a gente pode apertar “Alt + Enter” que ele já adiciona para mim os métodos que essa interface nos obriga a implementar. Então tenho aqui o get subscribed event.

Posso apagar todo esse comentário, ele explica como funciona, mas como a gente vai fazer aqui, vou explicando para você, eu vou apagar. Basicamente você precisa retornar um array associativo informando na chave que evento você quer escutar e no valor que método você quer escutar.

Eu quero escutar o evento de kernel events exception. E quero executar o método handle 404 exception, que vai ser um método que vou criar para tratar essa exceção de 404, de url não encontrada.

Não se esqueça se não estiver utilizando php stormy de importar toda a classe que eu for utilizando, o php importa para mim, mas se você não estiver utilizando ele não se esqueça de importar.

Agora vou criar esse método. Utilizando php stormy posso digitar pubf que ele já cria o método para mim. Vou definir esse nome. Todo método que trata e recebe um evento recebe um parâmetro, e dependendo do evento que a gente está recebendo esse parâmetro muda.

No caso do evento de exception, a gente recebe um execption event. Esse exception event está nesse name space. Com esse evento a gente pode fazer diversas coisas, como por exemplo pegar a exceção. E ela vou verificar se é instanceof not found http exception. Ou seja, se é daquele tipo que o Postman está mostrando para a gente, que é aquela exceção lançada quando a url não é encontrada.

Se não for desse tipo, não vou fazer nada. Simplesmente paro a execução e não faço nada. Se for desse tipo, vou executar alguma coisa. Como só tenho uma cláusula que vou executar não preciso negar, não preciso fazer a técnica de early return. O que vou fazer aqui é caso essa exceção lançada nesse evento seja do tipo not found, vou definir set response, ou seja, uma nova resposta, como uma resposta em JSON.

Para isso a gente poderia muito bem definir aqui new JSON response e vou dizer mensagem erro 404. Vamos ver se isso já funciona, se nosso exception handler já está pronto para cuidar das exceções. Se eu executar agora e tentar acessar essa url recebo a mensagem que defini utilizando JSON. Muito melhor.

Mas ainda não está uma mensagem muito atrativa. Se você se lembrar bem, a gente criou nos primeiros treinamentos uma classe chamada hyper mídia response, e nela também temos o método from error, que é exatamente o que a gente precisa. Temos no nosso evento um get exception que traz o erro para a gente.

Vou dar “Ctrl + Alt + V” no php stormy que isso extrai uma variável. E aqui tenho minha variável de resposta e vou definir essa resposta aqui. Vamos ver como fica agora.

Aconteceu um erro. O nosso from error devolve um hyper mídia response, a gente quer pegar um get response, ou seja, queremos pegar o response http, o response do Symfony, a partir desse hyper mídia response.

Agora que a gente tem o response, dessa vez deve funcionar, e tenho sucesso igual false e a mensagem é no route found. Só que se você reparar a gente está definindo aqui como 500 esse erro. Vamos modificar. Vou definir na response set status code para 404. Agora sim tenho o tratamento muito mais fino das exceções. Consigo pegar uma exceção que o próprio Symfony lança, tratar e devolver uma resposta de acordo com o padrão da minha aplicação.

Mas se você for utilizando a aplicação você provavelmente vai perceber que existem outros erros, como por exemplo quando tento criar uma entidade sem passar todos os valores, o que será que acontece? Vamos ver no próximo vídeo.

Sobre o curso Symfony Parte 3: Tratamento de erros, cache, logs e testes

O curso Symfony Parte 3: Tratamento de erros, cache, logs e testes possui 113 minutos de vídeos, em um total de 48 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

  • 1265 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1265 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1265 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1265 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas