[Laravel] Iniciantes – Tutorial: Criando um formulário de contato – Parte 03

Laravel para iniciantes

Esta é a terceira parte do tutorial “Criando um formulário de contato”. No post anterior, configuramos o MySQL e manipulamos alguns dados.

Nesse post vamos organizar a aplicação laravel criando uma classe que será responsável por controlar requisições pertinentes ao gerenciamento de mensagens. Vamos também tentar entender a injeção de dependência (IoC) na prática.


Passo 01: Criar o Controller

Abra o terminal e execute o seguinte comando:

Este comando cria uma classe chamada ContatoController dentro do diretório  app/Http/Controllers

Abra crie os métodos index() , enviar()  e listar()

Passo 02: Organizar o arquivo de rotas

Agora que criamos o ContatoController, podemos remover as closures dentro das rotas e apontá-las para os métodos do controller que criamos.

 


Sobre o IoC Container do Laravel (Injeção de Dependência)

Observe o método  enviar() do ContatoController:

Desde a primeira parte desse tutorial estamos trabalhando com injeção de dependência no Laravel. Ao colocar o parâmetro  Request $request o Laravel já cria uma instância da classe  Request para eu utilizar dentro do método. Isso é o IoC do Laravel trabalhando.

Poderíamos utilizar o IoC para criar a instância da classe Contato. Veja um exemplo:

É serio.. isso vai funcionar! Testa aí! 🙂

Os “Bindings”

Bem.. Utilizar o IoC para resolver classes concretas é desperdício. A coisa fica mais interessante quando trabalhamos com interfaces.

Vamos imaginar uma situação:

Ao inserir o contato no banco de dados, o sistema deve me notificar por email.

No primeiro momento, poderíamos utilizar a classe Mail do Laravel. Mas como isso é apenas uma imaginação, vamos criar uma classe para esta finalidade.

Crie o arquivo  app/NotificarEmail.php

Como vimos anteriormente, podemos adicionar esta classe como parâmetro no método  enviar() do ContatoController e deixar que o IoC do Laravel instancie:

Teste no seu navegador enviando uma mensagem:

Teste notificação IoC Laravel

Continuando nossa imaginação, vamos criar mais dois tipos: Notificação com Fumaça e Notificação com Pombo. Mas antes, vamos criar uma interface de notificação para essas classes implementar:

Crie a interface  app/NotificacaoInterface.php

Faça com que a classe  NotificacaoEmail implemente esta interface:

Agora crie a classe  app/NotificarFumaca.php

Crie também a classe  app/NotificarPombo.php

Agora podermos injetar a interface  NotificacaoInterface no método  save() e ver o efeito:

Tente enviar uma mensagem:

Erro ao resolver injeção no Laravel

Erro! A mensagem é clara: O laravel não conseguiu descobrir qual implementação da interface ele deve instanciar. É aí que entra os bindings. Com o “bind”você informa ao Laravel qual classe deve ser instanciada quando uma interface for injetada.

Vamos ver na prática. Abra o arquivo  app/Providers/AppServiceProvider.php  e edite:

Agora faça o teste no navegador:

Teste bind Laravel

Tente perceber o poder disso. Ao usar interfaces, eu desacoplo classes. Para o ContatoController não interessa se a notificação será feita por fumaça ou pombo.

Se amanhã meu cliente quiser que a notificação seja feita por código morse, não preciso abrir o Controller. Basta eu criar uma classe que implemente a  NotificacaoInterface  e alterar o bind .

Recomendo que você troque as implementações no bind e faça o teste. Funciona mesmo! 🙂

Dúvidas? Fique a vontade nos comentários!

  • Eder

    Jansen, parabéns, segui os 3 tutoriais e deu tudo 100%. Aguardando o próximo, rsrs.

    • Que bom Elder! 🙂
      Pretendo lançar a parte 4 amanhã

  • Carlos Gomes

    Olá Jansen!!! Venho seguindo o primeiro post, com o tutorial 1. Neste tutorial, depois que alterei para nova forma de criar as rotas, ao tentar cadastrar /enviar ou listar /lista dá o erro “Class ‘AppHttpControllersContato’ not found”

    • Olá Carlos! Verifique se você adicionou o “use AppContato;” no começo do ContatoController

      • Carlos Gomes

        Isso mesmo Jansen!!! Não tinha me atentado a isto… No tutorial anterior não tinha… E como copiei apenas as funções da classe não importei o use AppContato!!! Muito obrigado!!! Agora sim… Funcionou 100%…

  • Pingback: Laravel para Iniciantes: Tutorial "ContactMe"- Parte 04()

  • Pingback: Laravel para Iniciantes: Tutorial "ContactMe"- Parte 02()

  • Marcus Mota

    Parceiro, parabens pelo post, só uma dúvida, você disse que era NotificarPombo, mas vamos supor que eu queira notificar algumas vezes via email, como o laravel diferenciara qual dos dois eu to chamando ?

    • Olá Marcus! Primeiramente, obrigado!

      Bem.. daí vai depender da regra da sua aplicação.. “algumas vezes” ficou um pouco vago… Mas enfim, você poderia colocar a condição de instanciar a classe “NotificarEmail” dentro do método, com um if.. 😀

      • Marcus Mota

        Obrigado pela resposta, mas, então, qual seria a necessidade da interface então? isso que eu não entendi…já que eu posso colocar um if(tipo = 1) instancie notificar email else instancie notificar pombo

        • Não há o que agradecer! Aprendo muito tentando responder as perguntas 😀

          Vou editar minha resposta.. faltou um parênteses ” … você poderia (embora sobrecarregue o método com implementações além da responsabilidade dele) colocar a condição …”

          Será que melhora? rs..

          A necessidade da interface no exemplo fictício do post foi para atender o suposto requisito não-funcional de “permitir que a forma de autenticar seja trocada” ..

          Daí a implementação com a interface.. Dessa forma eu posso trocar a forma que o sistema notifica apenas trocando o bind() no AppServiceProvider.

  • Pingback: Laravel para Iniciantes: Tutorial "ContactMe"- Parte 05()

  • Tivon

    Pra quê tudo isso ? Com menos linhas de código você já faz isso !