Dominando Rotas Laravel

Publicados: 2022-12-12

Quando 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. Clique para Tweetar

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 .

Uma linha de comando mostrando o estado padrão do provedor de serviços de rota do Laravel.
Estado padrão do provedor de serviços de rota do Laravel.

Em vez de fazer isso, podemos carregar as rotas diretamente dentro de RouteServiceProvider.php , ignorando a pasta routes/ completamente.

Uma janela de linha de comando mostrando o carregamento das rotas do Laravel diretamente no provedor.
Carregando rotas do Laravel diretamente no provedor.

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.

Lutando com problemas de tempo de inatividade e WordPress? Kinsta é a solução de hospedagem projetada para economizar seu tempo! Confira nossos recursos

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. Fique confortável com o roteamento do Laravel neste guia completo Click to Tweet

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!