🚀 Capítulo 15: Parâmetros de Rotas e Guardas
🎯 Objetivo da Aula
Ao final desta aula, você será capaz de passar informações dinâmicas através da URL (parâmetros de rota) e proteger rotas específicas usando Guardas (Guards), impedindo que usuários não autorizados acessem áreas restritas.
🏢 O Cenário Prático (Seu Desafio)
Você precisa criar uma rota para ver os detalhes de um planeta específico passando o ID dele na URL (ex: /planeta/1). Além disso, a rota do Quartel General contém planos secretos e só pode ser acessada por quem tiver a credencial de “Mestre Jedi”!
🧠 Fundamentos: A Teoria Traduzida
1. Parâmetros de Rota (:id)
Servem para enviar dados na própria URL. O Angular entende que a parte que começa com : é uma variável.
- Configuração:
{ path: 'planeta/:id', component: DetalheComponent } - Uso:
localhost:4200/planeta/5(O Angular abrirá o componente e você poderá ler o número 5).
2. Guardas de Rota (CanActivate)
São funções que rodam antes de a rota ser aberta. Se a função retornar true, o usuário entra. Se retornar false, o acesso é bloqueado!
- Analogia: É o Stormtrooper (ou o segurança) na porta perguntando: “Identifique-se!“.
📖 Exemplo Guiado: Lendo Parâmetros e Protegendo a Rota
Vamos implementar os parâmetros e o guarda.
🛠️ Passo a Passo (Lendo Parâmetros)
Crie o componente detalhe-planeta. Para ler o parâmetro da URL, usamos o serviço ActivatedRoute:
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({ /* ... */ })
export class DetalhePlanetaComponent implements OnInit {
planetaId: string | null = '';
constructor(private route: ActivatedRoute) {}
ngOnInit(): void {
// Pega o parâmetro 'id' da URL
this.planetaId = this.route.snapshot.paramMap.get('id');
}
}🛠️ Passo a Passo (Criando um Guarda Funcional)
No Angular moderno, podemos criar um guarda como uma função simples no arquivo de rotas ou separado:
// app.routes.ts
import { inject } from '@angular/core';
import { Routes, CanActivateFn, Router } from '@angular/router';
// Função do Guarda
const jediGuard: CanActivateFn = (route, state) => {
const router = inject(Router);
const isJedi = true; // Simulação: mude para false para testar o bloqueio
if (isJedi) {
return true; // Permite o acesso
} else {
alert('Acesso negado! Apenas Mestres Jedi.');
router.navigate(['/painel']); // Redireciona
return false; // Bloqueia
}
};
export const routes: Routes = [
{ path: 'qg', component: QuartelGeneralComponent, canActivate: [jediGuard] },
{ path: 'planeta/:id', component: DetalhePlanetaComponent }
];🕹️ Como Executar e Testar no VS Code
- Salve tudo e execute
ng serve. - Digite na URL do navegador:
localhost:4200/planeta/42. Veja o componente exibir o número 42! - Tente acessar o QG. Se
isJediforfalse, você será jogado de volta para o painel!
🛠️ Prática Obrigatória 1
No componente detalhe-planeta, use o planetaId que você pegou da URL para exibir a mensagem: “Carregando dados do planeta código [ID]“.
🛠️ Prática Obrigatória 2
Mude a variável isJedi no guarda para false e tente clicar no link do Quartel General no menu. Verifique se o alerta aparece e se você é redirecionado.
🔑 Gabarito de Código/Fórmulas
Prática 1:
No HTML de detalhe-planeta:
<h2>Detalhes do Planeta</h2>
<p>Carregando dados do planeta código: {{ planetaId }}</p>