Laravel: Rotas e Controllers

Laravel: Rotas e Controllers

Continuando com a série de artigos sobre o Laravel, vou explicar como funcionam as rotas e complementar o nosso cadastro utilizando controllers. As rotas são os caminhos por onde nossas URLs passam. Os controllers são as classes onde definimos o comportamento do nosso aplicativo. Para acompanhar o desenvolvimento do nosso “CMS”, o código atual da nossa aplicação pode ser baixado neste link.

Rotas

As rotas, como já mencionado, são definições de qual controller será executado a partir da URL acessada. O arquivo onde são feitas estas definições é o app/routes.php. Nós já usamos este arquivo no post passado, mas usamos ele de uma maneira errada. O que nós fizemos foi colocar diretamente neste arquivo a nossa lógica. Vou explicar as alternativas que temos para trabalhar com rotas e depois vamos corrigir o nosso arquivo.

Comandos Básicos

Primeiro os comandos mais simples que podemos usar nas nossas rotas. Podemos executar uma ação especifica de acordo com nosso pedido HTTP utilizando os seguintes comandos:

Todos utilizam os mesmos parâmetros, sendo que o método Route::any() pode ser utilizado para qualquer tipo de pedido. Não é recomendado a sua utilização por não ser tão transparente quanto usar o método correto para a situação correta. Dois parâmetros são necessários:

O primeiro é a URL que vai “ativar” esta rota. Neste parâmetro você pode utilizar as URLs completas:

  • /artigos;
  • /artigos/inserir;
  • /artigos/editar;
  • /artigos/ler/um/artigo;

Além de poder utilizar parâmetros dentro da string da URL:

  • /artigos/{acao};
  • /artigos/ler/{id};

Estes parâmetros podem ser passados para a função utilizando o mesmo como uma variável:

O segundo parâmetro pode ser uma função anonima (uma Closure, em português – Clausura) como o exemplo acima, ou um método de um controller:

Neste caso ao acessar o endereço <dominio>/artigos o Laravel executaria o método showIndex() do controller ArtigoController. Dentro da função anonima ou do método do controller você pode definir uma série de respostas para aquela rota, vamos ver as respostas possíveis a seguir.

Repostas

A resposta de um pedido HTTP é basicamente o retorno da nossa função ou método. A maneira mais simples é retornar uma string:

Nada de interessante aí. Aprimorando isso você poderia retornar uma string com um HTML dentro do tipo:

Neste ponto chegamos as views. Ao invés de codificar o HTML diretamente dentro das nossas rotas e controllers, utilizamos views (ou visões). As views são criadas no diretório app/views e podem ser enviadas como resposta com o seguinte código:

Além de retornar HTML, podemos definir outros tipos de retorno dentro de nossas rotas e controllers:

Redirecionamentos

Você pode redirecionar o usuário utilizando o seguinte código:

Download de arquivos

Você pode definir a resposta como um download, para indicar para o browser que um arquivo deve ser baixado:

JSON

Você pode também enviar um JSON como resposta, especialmente útil para APIs e chamadas AJAX:

Filtros

Outra funcionalidade muito útil das rotas são os filtros. No arquivo app/filters.php é possível definir filtros que deve ser executados ao acessar determinadas rotas. Por exemplo, se você tem uma área do seu sistema que deve ser acessada somente por um usuário logado, basta criar um filtro verificando se o usuário está logado ou não.

Exemplo de filtro de login (já vem implementado por padrão):

Para utilizar este filtro você deve utilizar o seguinte código:

Você pode também agrupar diversas rotas para que o mesmo filtro seja executado sempre que o usuário tentar acessar uma dessas rotas:

Comandos Avançados

Finalizando essa longa explicação das rotas, mais alguns comandos que permitem um maior controle e flexibilidade nas rotas.

Nomes nas Rotas

Quando você dá um nome para a rota, pode utilizá-lo ao criar links no seu sistema (route(‘login’)) e para redirecionar utilizando Redirect::route(‘login’).

Rotas HTTPS

Filtro dos Parâmetros

Prefixos nas Rotas

Utilizando prefixos como no exemplo acima, o Laravel vai entender as URLs no formato artigos/php, artigos/java, etc.

Controllers

Como já expliquei anteriormente podemos associar nossas rotas aos nossos controllers da seguinte maneira:

O problema é que a cada método, teríamos que alterar nosso arquivo de rotas e adicionar a nova rota para o novo método. A maneira que o Laravel utiliza para resolver este problema é utilizar controllers REST.

O que vai acontecer agora é o seguinte:

  • Se você acessar /artigos, o Laravel vai executar o método getIndex() do ArtigosController.
  • Se você acessar /artigos/inserir, o Laravel vai executar o método getInserir() do ArtigosController.
  • Se você fizer o POST do /artigos/inserir, o Laravel vai executar o método postInserir() do ArtigosController.

Já deu para perceber como vai funcionar? O Laravel vai utilizar o tipo de pedido HTTP e a segunda parte da URL para acessar diretamente o método correto. Quando não existe a segunda parte da URL, então será executado o método padrão Index.

Controllers

Os controllers são a “central lógica” da nossa aplicação. É no controller que processamos a entrada do usuário e executamos nossos models. Na prática eles são classes que criamos em app/controllers e que estendem a classe BaseController. Vamos agora voltar a nossa aplicação, vou fazendo as alterações e mostrando o código.

Aplicação

Vamos começar modificando nosso arquivo de rotas:

Se você comparar com o código anterior, removemos todo aquele código que estava aqui. Aquela lógica será movida para um novo arquivo, o ArtigosController, que deve ser criado em app/controllers.

E é só isso que precisamos para organizar as rotas e criar nosso primeiro controller. Mas vamos aproveitar e melhorar a aplicação um pouco. Ainda não somos capazes de editar e excluir os artigos, portanto vamos adicionar alguns links na nossa view artigos.php:

Nesta view exibimos a lista de artigos existentes no banco de dados. Eu adicionei um link para inserir um novo artigo, links para editar e remover artigos existentes e umas linhas (HR) para facilitar a visualização. Se você tentar acessar os links para editar ou remover, adivinhe o que acontecerá? Um erro. E por que? Porque não temos métodos para editar ou remover no nosso controller.

Lembre-se que a rota foi definida usando Route::controller, isso significa que quando acessarmos artigos/editar, o Laravel vai procurar no controller ArtigosController pelo método getEditar(). Vamos atualizar nosso controller então:

Temos três métodos novos no ArtigosController:

  • getEditar e postEditar: responsáveis pela alteração dos artigos – ainda precisamos de uma nova view aqui.
  • getRemover: responsável pela exclusão de artigos.

Os dois métodos GET tem um parâmetro $id. Este parâmetro é um número que é passado na URL artigos/editar/id. Vamos criar a view artigos_editar, para a edição:

Nesta view temos os valores preenchidos com o que buscamos no banco. Também acrescentei um campo INPUT do tipo hidden, para o ID do artigo. Este ID é enviado junto dos dados do formulário no POST, para que no método postEditar() possamos usar este ID com o comando Input::get(‘id’).

Conclusão

Até agora já montamos a estrutura básica de uma aplicação. Vimos a interação com o banco de dados usando migrações e o Eloquent ORM. Hoje expliquei como funcionam as rotas e isso foi aplicado no nosso aplicativo. Para a próxima etapa, vamos reescrever nossas views usando o sistema de templates Blade. Até a próxima.

Este post é parte da série Desenvolvendo com Laravel.

14 respostas para “Laravel: Rotas e Controllers”

  1. Boas,
    Trabalho em asp.net mvc e estou a gostar do laravel, visto que é um MVC como conheço.
    Dúvida: no getRemover() vc faz $artigo->delete(); e pronto, redirecciona.
    Não tem que fazer $artigo->save(); ?

    Estou abituado a usar o EntitieFramework com o ADO.NET e tenho que fazer o save depois do remove 😉

    Cumprimentos e muito bom trabalho!!!

      1. E no caso de querer apresentar uma view para confirmar o delete ?
        Posso usar o getRemover() para construir uma view com os dados dos artigo, e depois nessa view uma form onde vou enviar para o postRemover() e aí é que faz o Artigo::destroy($id). Legal assim?

        Cumprimentos

  2. Olá

    não lembro quando aconteceu isso, se só notei hoje… mas mesmo tendo no arquivo de rotas Route::controller(‘artigos’, ‘ArtigosController’); o meu arquivo acessado é o controllers/Artigos (era um arquivo de teste, ele tem o mesmo conteúdo do ArtigosCotroller.php mas se eu modificar o Artigos.php dá pau na aplicação)
    Nao consigo entendr o porquê

        1. Dependendo da estrutura que você montar, com namespaces, sub diretórios, etc, pode ser necessário executar o composer dump-autoload para que o composer crie arquivo que carrega as classes novamente.

          Com relação a nomenclatura, eu geralmente utilizo ArtigoController para não dar conflito com um modelo Artigo.

    1. Várias maneiras… minha sugestão é adicionar uma rota e um controller para isso, com as respectivas views. Dentro do controller você cria os métodos get e post para o formulário de contato com a lógica necessária. O Laravel já possui uma boa biblioteca pra envio do contato por email.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *