Introdução
No Laravel, as rotas são essenciais para definir como os pedidos HTTP são processados pela aplicação. As rotas determinam quais controladores e métodos serão chamados quando um utilizador faz uma requisição a um URL específico. Vejamos como podemos definir rotas no Laravel de forma detalhada e prática.
1. O ficheiro de rotas
Laravel utiliza o ficheiro routes/web.php
para definir as rotas das aplicações web. Este ficheiro é automaticamente carregado pelo framework.
// routes/web.php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
Neste exemplo, estamos a definir uma rota que responde a requisições GET no URL raiz (/
). Quando um utilizador visita este URL, a função anónima retorna a vista welcome
.
2. Definir rotas básicas
Existem diferentes tipos de requisições HTTP que podemos mapear para rotas, tais como GET, POST, PUT, DELETE, entre outros. Vejamos alguns exemplos:
// Rotas GET
Route::get('/produtos', 'ProdutoController@index');
// Rota POST
Route::post('/produtos', 'ProdutoController@store');
// Rota PUT
Route::put('/produtos/{id}', 'ProdutoController@update');
// Rota DELETE
Route::delete('/produtos/{id}', 'ProdutoController@destroy');
Estas rotas mapeiam operações de CRUD (Create, Read, Update, Delete) para o controlador ProdutoController
. Por exemplo, ProdutoController@index
será chamado quando um utilizador visitar /produtos
.
3. Parâmetros nas rotas
É possível definir parâmetros dinâmicos nas rotas, que passam valores diretamente para o controlador. Vamos ver um exemplo:
Route::get('/produtos/{id}', 'ProdutoController@show');
Aqui, o {id}
é um parâmetro dinâmico que pode ser acedido dentro do método show
do ProdutoController
.
// ProdutoController.php
public function show($id)
{
$produto = Produto::find($id);
return view('produtos.show', compact('produto'));
}
4. Restrições de parâmetros
Podemos restringir os parâmetros utilizando expressões regulares. Por exemplo, se quisermos que o id
seja sempre um número:
Route::get('/produtos/{id}', 'ProdutoController@show')->where('id', '[0-9]+');
5. Agrupar rotas
Para simplificar a gestão das rotas, Laravel permite agrupá-las. Vejamos como criar um grupo de rotas para os produtos:
Route::prefix('produtos')->group(function () {
Route::get('/', 'ProdutoController@index');
Route::post('/', 'ProdutoController@store');
Route::get('/{id}', 'ProdutoController@show');
Route::put('/{id}', 'ProdutoController@update');
Route::delete('/{id}', 'ProdutoController@destroy');
});
O prefixo 'produtos'
será automaticamente adicionado às rotas dentro deste grupo.
6. Rotas nomeadas (named routes)
Rotas nomeadas facilitam a geração de URLs e redirecionamentos dentro da aplicação:
Route::get('/produtos/{id}', 'ProdutoController@show')->name('produtos.show');
Podemos então usar este nome ao criar links ou ao redirecionar:
// Gerar uma URL
$url = route('produtos.show', ['id' => 1]);
// Redirecionar
return redirect()->route('produtos.show', ['id' => 1]);
7. Definir Rotas de Recursos (resource routes)
No Laravel, rotas de recursos são uma forma conveniente de definir todas as rotas necessárias para realizar operações CRUD (Criar, Ler, Atualizar e Apagar) num determinado recurso, como produtos, utilizadores, ou artigos. O Laravel fornece um comando específico que cria automaticamente essas rotas essenciais de forma padronizada e eficiente.
O que são Rotas de Recursos?
Uma rota de recurso mapeia as ações de um Controller a URLs específicas para um determinado recurso. Por exemplo, para um produto, as rotas de recursos permitem criar endpoints que lidam com todas as operações necessárias para a gestão desse produto: apresentar, mostrar, criar, editar, atualizar e apagar. Estas rotas são definidas de maneira simplificada utilizando o método Route::resource(), que cria automaticamente várias rotas pré-configuradas, associadas ao Controller que gere esse recurso.
Passo 1: Definir as Rotas de Recursos no web.php
Para definir as rotas de recursos do Produto no Laravel, tudo o que se precisa de fazer é adicionar a seguinte linha ao ao ficheiro routes/web.php:
Route::resource('produtos', ProdutoController::class);
Explicação do Código:
- Route::resource('produtos', ProdutoController::class);:
*
produtos
: Define o nome do recurso que estamos a gerir. Neste caso, estamos a definir rotas para um recurso chamado produtos. *ProdutoController::class
: Define o controlador que vai tratar as diferentes ações para este recurso. O Laravel espera que este controlador siga a convenção de nomes e métodos como index, show, create, store, edit, update, e destroy.
Rotas Geradas Automaticamente Quando usa Route::resource(), o Laravel cria automaticamente as seguintes rotas para o controlador de produtos:
| Método HTTP | Caminho | Ação | Método do Controller |
|-------------|----------------------|----------------------------------------|------------------------|
| GET | /produtos | Mostrar todos os produtos | `index()` |
| GET | /produtos/create | Exibir o formulário de criação de um produto | `create()` |
| POST | /produtos | Guardar um novo produto | `store()` |
| GET | /produtos/{produto} | Mostrar um produto específico | `show()` |
| GET | /produtos/{produto}/edit | Exibir o formulário de edição de um produto | `edit()` |
| PUT/PATCH | /produtos/{produto} | Atualizar um produto | `update()` |
| DELETE | /produtos/{produto} | Apagar um produto | `destroy()` |
Vantagens de Usar Rotas de Recursos:
- Padronização: Todas as rotas seguem um padrão claro, facilitando a manutenção e a escalabilidade do código.
- Eficiência: Em vez de definir manualmente cada rota individualmente, com Route::resource() poupamos tempo e reduzimos a repetição de código.
- Clareza: O Laravel adota uma convenção comum para operações CRUD, tornando o código mais fácil de ler e entender.
Exemplo Completo no routes/web.php:
Aqui está um exemplo de como o arquivo routes/web.php pode ficar após adicionar a rota de recursos para o modelo de Produto:
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ProdutoController;
Route::get('/', function () {
return view('welcome');
});
// Definir as rotas de recursos para produtos
Route::resource('produtos', ProdutoController::class);
Neste exemplo, adicionamos a definição da rota de recurso produtos associada ao ProdutoController. Com esta linha, o Laravel cria automaticamente todas as rotas necessárias para realizar as operações CRUD do recurso produto.
Resumo
Definir rotas no Laravel é um processo fundamental que liga URLs a controladores e métodos específicos. Aprendemos a definir rotas básicas, rotas com parâmetros, aplicar restrições de parâmetros, agrupar rotas e criar rotas nomeadas. Estas práticas organizam e simplificam o código, tornando a aplicação mais flexível e fácil de manter.