Dominando Rotas Laravel
Publicados: 2022-12-12Quando se trata do back-end, os desenvolvedores acabam encontrando rotas. As rotas podem ser consideradas a espinha dorsal do back-end, pois cada solicitação que o servidor recebe é redirecionada para um controlador por meio de uma lista de roteamento que mapeia as solicitações para controladores ou ações.
O Laravel esconde muitos detalhes de implementação para nós e vem com muito açúcar sintático para ajudar desenvolvedores novos e experientes a desenvolver seus aplicativos da web.
Vamos dar uma olhada em como gerenciar rotas no Laravel.
Roteamento de Back-end e Cross-Site Scripting em Laravel
Em um servidor, existem rotas públicas e privadas. As rotas públicas podem ser motivo de preocupação devido à possibilidade de cross-site scripting (XSS), um tipo de ataque de injeção que pode deixar você e seus usuários vulneráveis a agentes mal-intencionados.
O problema é que um usuário pode ser redirecionado de uma rota que não requer um token de sessão para outra que exige — e ainda terá acesso sem o token.
A maneira mais simples de resolver esse problema é impor um novo cabeçalho HTTP, adicionando “referrer” à rota para mitigar esse cenário:
'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]
Laravel Roteamento Básico
No Laravel, as rotas permitem que os usuários encaminhem a solicitação apropriada para o controlador desejado. A rota Laravel mais básica aceita um identificador de ativo uniforme (seu caminho de rota) e um fechamento que pode ser uma função ou uma classe.
No Laravel, as rotas são criadas dentro dos arquivos web.php e api.php . O Laravel vem com duas rotas por padrão: uma para a WEB e outra para a API.
Essas rotas residem na pasta routes/ , mas são carregadas em Providers/RouteServiceProvider.php .
Em vez de fazer isso, podemos carregar as rotas diretamente dentro de RouteServiceProvider.php , ignorando a pasta routes/ completamente.
Redirecionamentos
Quando definimos uma rota, geralmente queremos redirecionar o usuário que a acessa, e os motivos para isso variam muito. Pode ser porque é uma rota obsoleta e mudamos o back-end ou o servidor, ou pode ser porque queremos instalar a autenticação de dois fatores (2FA) e assim por diante.
Laravel tem uma maneira fácil de fazer isso. Graças à simplicidade do framework, podemos utilizar o método redirect na fachada Route, que aceita a rota de entrada e a rota a ser redirecionada.
Opcionalmente, podemos fornecer o código de status para o redirecionamento como terceiro parâmetro. O método permanentRedirect
fará o mesmo que o método redirect
, exceto que sempre retornará um código de status 301:
// Simple redirect Route::redirect("/class", "/myClass"); // Redirect with custom status Route::redirect("/home", "/office", 305); // Route redirect with 301 status code Route::permanentRedirect("/home", "office");
Dentro das rotas de redirecionamento, estamos proibidos de usar as palavras-chave “destination” e “status” como parâmetros, pois são reservadas pelo Laravel.
// Illegal to use Route::redirect("/home", "/office/{status}");
Visualizações
As visualizações são os arquivos . arquivos blade.php que usamos para renderizar o front-end de nosso aplicativo Laravel. Ele usa o mecanismo de modelagem blade e é a maneira padrão de criar um aplicativo full-stack usando apenas o Laravel.
Se quisermos que nossa rota retorne uma visão, podemos simplesmente usar o método view na fachada Route. Ele aceita um parâmetro de rota, um nome de exibição e uma matriz opcional de valores a serem passados para a exibição.
// When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");
Vamos supor que nossa view queira dizer “Hello, {name}
” passando um array opcional com esse parâmetro. Podemos fazer exatamente isso com o seguinte código (se o parâmetro ausente for necessário na exibição, a solicitação falhará e gerará um erro):
Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);
Lista de rotas
À medida que seu aplicativo cresce em tamanho, também aumenta o número de solicitações que precisam ser roteadas. E com um grande volume de informações pode vir uma grande confusão.
É aqui que o artisan route:list command
pode nos ajudar. Ele fornece uma visão geral de todas as rotas definidas no aplicativo, seus middlewares e controladores.
php artisan route:list
Ele exibirá uma lista de todas as rotas sem os middlewares. Para isso, temos que usar o sinalizador -v
:
php artisan route:list -v
Em uma situação em que você pode estar usando um design orientado a domínio em que suas rotas têm nomes específicos em seus caminhos, você pode usar os recursos de filtragem deste comando da seguinte forma:
php artisan route:list –path=api/account
Isso mostrará apenas as rotas que começam com api/account .
Por outro lado, podemos instruir o Laravel a excluir ou incluir rotas definidas por terceiros usando as opções –except-vendor
ou –only-vendor
.
Parâmetros de rota
Às vezes, pode ser necessário capturar segmentos do URI com a rota, como um ID de usuário ou token. Podemos fazer isso definindo um parâmetro de rota, que é sempre colocado entre chaves ( {}
) e deve consistir apenas em caracteres alfabéticos.
Se nossas rotas tiverem dependências dentro de seus callbacks, o contêiner do serviço Laravel irá injetá-las automaticamente:
use Illuminate\Http\Request; use Controllers/DashboardController; Route::post('/dashboard/{id}, function (Request $request, string $id) { return 'User:' . $id; } Route::get('/dashboard/{id}, DashboardController.php);
Parâmetros Necessários
Os parâmetros obrigatórios do Laravel são parâmetros em rotas que não podemos pular quando fazemos uma chamada. Caso contrário, um erro será lançado:
Route::post("/gdpr/{userId}", GetGdprDataController.php");
Agora dentro do GetGdprDataController.php teremos acesso direto ao parâmetro $userId .
public function __invoke(int $userId) { // Use the userId that we received… }
Uma rota pode ter qualquer número de parâmetros. Eles são injetados nos callbacks/controladores de rota com base na ordem em que são listados:
// api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }
Parâmetros Opcionais
Em uma situação em que queremos fazer algo em uma rota quando apenas um parâmetro está presente e nada mais, tudo sem afetar toda a aplicação, podemos adicionar um parâmetro opcional. Esses parâmetros opcionais são indicados pelo ?
anexado a eles:
Route::get('/user/{age?}', function (int $age = null) { if (!$age) Log::info("User doesn't have age set"); else Log::info("User's age is " . $age); } Route::get('/user/{name?}', function (int $name = "John Doe") { Log::info("User's name is " . $name); }
Curinga de rota
O Laravel fornece uma maneira de filtrar como devem ser nossos parâmetros opcionais ou obrigatórios.
Digamos que queremos uma string de um ID de usuário. Podemos validá-lo assim no nível da rota usando o método where
.
O método where
aceita o nome do parâmetro e a regra regex que será aplicada na validação. Por padrão, ele pega o primeiro parâmetro, mas se tivermos muitos, podemos passar um array com o nome do parâmetro como chave e a regra como valor, e o Laravel irá analisar todos eles para nós:
Route::get('/user/{age}', function (int $age) { // }->where('age', '[0-9]+'); Route::get('/user/{age}', function (int $age) { // }->where('[0-9]+'); Route::get('/user/{age}/{name}', function (int $age, string $name) { // }->where(['age' => '[0-9]+', 'name' => '[az][Az]+');
Podemos dar um passo adiante e aplicar a validação em todas as rotas em nosso aplicativo usando o método pattern
na fachada Route
:
Route::pattern('id', '[0-9]+');
Isso validará cada parâmetro id
com esta expressão regex. E uma vez que o definimos, ele será aplicado automaticamente a todas as rotas que usam esse nome de parâmetro.
Como podemos ver, o Laravel está usando o caractere /
como separador no caminho. Se quisermos usá-lo no caminho, temos que permitir explicitamente que ele faça parte de nosso espaço reservado usando um where
regex.
Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');
A única desvantagem é que será suportado apenas no último segmento da rota.
Rotas nomeadas
Como o nome sugere, podemos nomear rotas, o que torna conveniente gerar URLs ou redirecionar para rotas específicas.
Como criar rotas nomeadas
Uma maneira simples de criar uma rota nomeada é fornecida pelo método name
encadeado na fachada Route
. O nome de cada rota deve ser único:
Route::get('/', function () { })->name("homepage");
Grupos de rotas
Os grupos de rotas permitem que você compartilhe atributos de rota como middlewares em um grande número de rotas sem precisar redefini-lo em cada rota.
Middleware
Atribuir um middleware a todas as rotas que temos nos permite combiná-las em um grupo, primeiro usando o método group
. Uma coisa a considerar é que os middlewares são executados na ordem em que são aplicados ao grupo:
Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });
controladores
Quando um grupo utiliza o mesmo controlador, podemos usar o método controller
para definir o controlador comum para todas as rotas desse grupo. Agora temos que especificar o método que a rota irá chamar.
Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });
Roteamento de Subdomínio
Um nome de subdomínio é uma informação adicional adicionada ao início do nome de domínio de um site. Isso permite que os sites separem e organizem seu conteúdo para funções específicas, como lojas online, blogs, apresentações e assim por diante, do restante do site.
Nossas rotas podem ser usadas para lidar com o roteamento de subdomínio. Podemos capturar o domínio e uma parte do subdomínio para uso em nosso controlador e rota. Com a ajuda do método domain
na fachada Route
, podemos agrupar nossas rotas em um único domínio:
Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });
Prefixos e prefixos de nomes
Sempre que tivermos um grupo de rotas, ao invés de modificá-las uma a uma, podemos fazer uso das utilidades extras que o Laravel fornece, como prefix
e name
na fachada Route
.
O método prefix
pode ser usado para prefixar cada rota no grupo com um determinado URI, e o método name
pode ser usado para prefixar cada nome de rota com uma determinada string.
Isso nos permite criar coisas novas, como rotas de administração, sem ser necessário modificar todo e qualquer nome ou prefixo para identificá-los:
Route::name('admin.")->group(function() { Route::prefix("admin")->group(function() { Route::get('/get')->name('get'); Route::put('/put')->name(put'); Route::post('/post')->name('post'); }); });
Agora, os URIs para essas rotas serão admin/get
, admin/put
, admin/post
e os nomes admin.get
, admin.put
e admin.post
.
Cache de rota
Ao implantar o aplicativo em servidores de produção, um bom desenvolvedor Laravel aproveitará o cache de rota do Laravel.
O que é cache de rota?
O cache de rota diminui o tempo necessário para registrar todas as rotas do aplicativo.
Executando php artisan route:cache
uma instância de Illuminate/Routing/RouteCollection
é gerada e, após ser codificada, a saída serializada é gravada em bootstrap/cache.routes.php
.
Agora, qualquer outra solicitação carregará esse arquivo de cache, se ele existir. Portanto, nosso aplicativo não precisa mais analisar e converter entradas do arquivo de rota em objetos Illuminate/Routing/Route
em Illuminate/Routing/RouteCollection
.
Por que é importante usar o cache de rota
Ao não usar o recurso de cache de rota fornecido pelo Laravel, seu aplicativo corre o risco de ser executado mais lentamente do que poderia, o que pode diminuir as vendas, a retenção de usuários e a confiança em sua marca.
Dependendo da escala do seu projeto e quantas rotas existem, a execução de um simples comando de cache de rota pode acelerar seu aplicativo em qualquer lugar de 130% a 500% - um ganho enorme para quase nenhum esforço.
Resumo
O roteamento é a espinha dorsal do desenvolvimento de back-end. A estrutura Laravel se destaca nisso, fornecendo uma maneira detalhada de definir e gerenciar rotas.
O desenvolvimento pode, de fato, ser acessível para todos e ajudar a acelerar um aplicativo apenas pelo fato de ser construído no Laravel.
Que outros truques e dicas você encontrou em relação às rotas do Laravel? Deixe-nos saber na seção de comentários!