Introdução ao Laravel Framework – Parte 04 – Rotas
Saudações, queridos devs! 😎👍
No post anterior discutimos a arquitetura de uma aplicação Laravel, seus principais elementos e sua estrutura de pastas. Agora iremos discutir sobre como funcionam as rotas para as requisições dos clientes. Bora! 🚀
1. Definição
As rotas são parte essencial de qualquer aplicação web, pois elas definem o ponto de entrada das requisições dos clientes, sejam eles um browser, um aplicativo mobile ou outro tipo de sistema.
No Laravel, o Route Service Provider (App/Providers/RouteServiceProvider) é o responsável por carregar automaticamente os arquivos de rotas que ficam na pasta /routes.
Os principais arquivos de rotas são:
- web.php: rotas para requisições web. Essas requisições são filtradas por middlewares que controlam sessões, encriptação de cookies e CSRF Protection (cross-site request forgery).
- api.php: requisições que não necessitam acessar o estado da aplicação (sessão), ou seja, normalmente são realizadas usando tokens de autenticação. Se você quer expor as funcionalidades de sua aplicação para agentes externos, como aplicativos móveis ou outros sistemas, é aqui que as rotas são configuradas.
O arquivo web.php normalmente possui uma rota predefinida, que retorna a view de boas vindas da aplicação Laravel. Veja:
Route::get('/', function () {
return view('welcome');
});
No código mostrado, a classe Route (Illuminate\Support\Facades\Route) está tratando uma requisição via GET recebida na URL raiz, ou seja “/”. O tratamento é simples e consiste em executar uma closure (função anônima) que retorna uma view (as views da aplicação ficam em resources/views) chamada welcome.
Apesar de ser simples, essa não é uma boa prática, pois, considerando o padrão arquitetural MVC, as rotas devem apenas redirecionar as requisições para um controlador. É no controlador que as requisições devem ser tratadas de fato, como veremos nos próximos posts.
2. Testando retornos simples
Vamos adicionar uma rota e retornar um dado. Esse dado pode ser qualquer coisa, desde um arquivo, até um fluxo de string em formato JSON ou HTML, por exemplo. Adicione o seguinte código logo abaixo do código predefinido:
Route::get('/helloworld', function (){
echo "<h1>Hello World!</h1>";
});
Abra o navegador e digite o endereço: http://127.0.0.1:8000/helloworld. Agora a rota /helloworld está retornando um código HTML simples.
3. Passando parâmetros em rotas
É possível passar parâmetros nas rotas, no formato path parameters, fazendo o uso das URLs amigáveis (clear URLs). No exemplo a seguir, passamos um parâmetro name, que deve aparecer entre chaves, para a rota /helloworld. A closure que trata essa requisição deve receber um parâmetro de entrada com o mesmo nome. Assim, na execução da função o parâmetro estará disponível para ser usado. Veja:
Route::get('/helloworld/{name}', function ($name){
echo "<h1>Hello World!</h1>";
echo "<h2>User: $name </h2>";
});
Faça o teste: http://localhost/helloworld/Jorge
Para passar mais de um parâmetro, basta adicionar uma barra (/) e o novo parâmetro. Claro, na closure o parâmetro de entrada também deve ser definido. Veja o exemplo a seguir:
Route::get('/helloworld/{name}/{email}', function ($name, $email){
echo "<h1>Hello World!</h1>";
echo "<h2>User: $name </h2>";
echo "<h2>User: $email </h2>";
});
Faça o teste: http://localhost/helloworld/Jorge/jorge@jorge.com
4. Parâmetros opcionais
É possível fazer com que um ou mais parâmetros tornem-se opcionais. Para isso basta adicionar o ponto de interrogação (?) no parâmetro definido na rota e, nos parâmetros da closure, definir um valor padrão null. Veja:
Route::get('/helloworld/{name}/{email?}', function ($name, $email = null){
echo "<h1>Hello World!</h1>";
echo "<h2>User: $name </h2>";
echo $email ? "<h2>User: $email </h2>" : '';
});
No navegador, faça os testes:
- localhost:8000/helloworld/myname/
- localhost:8000/helloworld/myname/myemail
5. Rotas com restrições
Também podemos definir expressões regulares para restringir a entrada na rota. No exemplo a seguir usamos o método where para validar o parâmetro name, que aceita somente letras maiúsculas ou minúsculas. Se passarmos um número, a aplicação retornará o Erro 404.
Route::get('/helloworld/{name}/{email?}', function ($name, $email = null){
echo "<h1>Hello World!</h1>";
echo "<h2>User: $name </h2>";
echo $email ? "<h2>User: $email </h2>" : '';
})->where('name', '[A-Za-z]+’);
Faça o teste. A URL a seguir deve retornar um erro: http://localhost:8000/helloworld/222
Para adicionar restrições com várias regras, utilize arrays de expressões regulares. Veja:
Route::get('/helloworld/{name}/{email?}', function ($name, $email = null){
echo "<h1>Hello World!</h1>";
echo "<h2>User: $name </h2>";
echo $email ? "<h2>User: $email </h2>" : '';
})->where(['name' => '[A-Za-z]+' , 'email' => '[0-9]+'] );
6. Agrupamento de rotas
Um outro recurso interessante é a possibilidade agrupar rotas, objetivando organizar melhor o código, preservando sua legibilidade. No exemplo a seguir, o método prefix() determina um prefixo para a rota. O método group() recebe uma closure em que tratamos as rotas que iniciam com o prefixo.
Assim, a rota “/app” é tratada pela rota “/” dentro do grupo. Por sua vez, a rota “/app/user” é tratada pela segunda chamada do método Route::get no grupo. Veja:
Route::prefix('/app')->group( function (){
Route::get('/', function(){
return "My App!";
});
Route::get('/user', function(){
return "My User!";
});
});
7. Rotas nomeadas
É possível definir um nome para simplificar o acesso a uma rota. Assim, ao invés de memorizarmos o rota completamente, com seus caminhos etc, precisamos lembrar apenas do nome. Para isso, devemos usar o método name. No exemplo a seguir, criamos damos um nome ‘profile’ para a rota ‘/user/profile’. Veja:
Route::get('/user/profile', function () {
return "My Profile!";
})->name('profile’);
Para acessar essa rota por meio do nome, é necessário usar a função route(route-name) que retorna a URL completa da rota. Em exemplos futuros iremos entender melhor como isso funciona. 😉
8. Inspecionando rotas
A medida que a aplicação cresce, as rotas também vão se multiplicando. Por isso o Laravel disponibiliza, por meio de sua CLI (command-line interface) comandos para inspecionar rotas. Você pode usar o terminal que achar melhor, como o Prompt de comando, o PowerShell ou outro. Lembre-se apenas de estar dentro da pasta do projeto.
Veja os comandos:
php artisan route:list
– exibe todas as rotasphp artisan route:list --method=GET
– exibe somente as rotas GETphp artisan route:list --method=POST
– exibe somente as rotas POST
9. Conclusão
As rotas são ponto de entrada para as requisições que os clientes farão em sua aplicação back-end. Portanto, é necessário compreender todas as nuances e possibilidades de configuração.
Lembre-se: Como dito anteriormente, as rotas devem se preocupar em redirecionar as requisições para um controlador específico e não tratar diretamente no arquivo de rotas. Isso não é uma boa prática! 😯
Usamos essa abordagem apenas para simplificar os exemplos, pois o foco deste post era discutir as rotas.
Para saber mas sobre as rotas do Laravel, consulte a documentação oficial.
No próximo post falaremos sobre controladores e abordaremos outros aspectos importantes das rotas. Até lá! 😃