Skip to content

Symfony2: Serviço para recuperar Endereço apartir do CEP (Brasil) em formulário por AJAX

 

Hoje vou compartilhar com vocês um serviço para o Symfony2 que criei para recuperar um endereço (logradouro, bairro, cidade e estado) apartir do CEP usando o web service dos Correios do Brasil. Isto pode ser de grande utilidade em formulários de cadastro.

 

cep

 

No screenshot do formulário encima, o usuário ao entrar o CEP e clicar na Lupa os campos Logradouro, Bairro, Cidade e Estado vão se autocompletar.

 

Primeiro vamos criar o nosso service chamado CorreiosService. O método cep2endereco(string cep) vai chamar a seguinte URL http://m.correios.com.br/movel/buscaCepConfirma.do enviando o CEP em formato 99999-999 ou 99999999 por POST, vai parsear o resultado e retornar ele dentro de um Array.

 

Project/src/AppBundle/Service/CorreiosService.php

 

 

Uma vez que já temos nosso service vamos declarar ele no arquivo services.yml com o nome de app.correios para poder acessar ele em qualquer lugar dentro do nosso projeto.

 

Project/app/config/services.yml

 

 

É possivel acessar o nosso serciço desde qualquer controller de esta maneira.

 

Agora que temos acesso o nosso serviço, vamos criar um controller chamado AjaxController na rota (/ajax/cep/). Quando enviamos o CEP por GET (/ajax/cep/?cep=22020-002) ele retorna um JSON como o endereço com a estrutura seguinte.

 

 

Project/src/AppBundle/Controller/AjaxController.php

 

 

Agora vamos criar um script Javascript usando a librária jQuery para detectar o evento de click no botão de Lupa e ai como o método getJSON enviar o CEP colocado no primeiro input, recuperar o JSON retornado pelo controller e preencher os inputs logradouro, bairro, cidade e estado automaticamente.

 

Project/web/assets/js/scripts.js

 

 

Finalmente, já só falta a view da secção do form onde sai o template do endereço (não vou colocar o Form Type nem a Entity neste exemplo). Este exemplo usa Bootstrap3 e os iconos FontAwesome. O mais importante aqui é colocar as seguintes classes css para indicar a que campo pertence cada input (ac-cep, ac-logradouro, ac-bairro, ac-cidade e ac-estado), a classe btn-cep2endereco, e a propiedade data-route=”{{ path(‘ajax_cep’) }}” no botão da Lupa.

 

Project/app/Resources/views/form.html.twig

 

Cualquer duvida é so deixar um comentario.

Share on Facebook7Tweet about this on TwitterShare on Google+0Share on Reddit0Email this to someone

I 'm a programmer , systems analyst and designer of websites , apps and software since 2006. Study in Marseille and currently living in Rio de Janeiro and work as Symfony developer.

  • Andre Silva

    Olá, fiz exatamente como esta em seu tutorial e na hora de rodar esta me dando esta mensagem

    Attempted to load class “CorreiosService” from namespace “AlsBundleService”.
    Did you forget a “use” statement for another namespace?

    Sou novo em programação então ainda tenho dificuldade em entender bem os erros, vou deixar aqui meu codigo no git

    https://github.com/Elyunterim/Cidades-e-Estados

    • jfa

      Boa tarde André, obrigado por comentar sua duvida com a gente.

      No arquivo:
      app/config/services.yml

      Tem de tomar cuidado, o caminho a classe tava errado e tem de deixar só assim (não repetir o ‘service:’):

      No arquivo:
      /src/Code/AlsBundle/Controller/AjaxController.php

      Não é preciso o:

      Tenta assim para ver.

      Outra maneira de usar é sem declarar a classe CorreiosService como serviço do Symfony e fazer da seguinte forma:

      Espero que isto resolva seu problema.
      Qualquer outra duvida é só postar.

      😉

      • Andre Silva

        Obrigado cara deu certo! Já esta salvo seu site aqui nos favoritos, e obrigado pela prontidão em responder a dúvida, sou novo em symfony2 e estou adorando trabalhar com ele, quando tiver mais conteúdo ou vídeos sobre symfony2 vai ser um prazer aprender com suas técnicas! Quero aprender coisas como por ex: como fazer um search sobre produtos, envio de emails, cadastrar usuários pegando dados do facebook… mas devagar vou indo por etapas! Mais uma vez valew a forca e o conteúdo disponível.

        • jfa

          Que bom que deu certo!!
          Força ai com o Symfony2 que é um framework com infinidade de possibilidades!!!