Como criar um redirecionador de links no laravel com banco de dados e quando a pessoa acessar o link é direcionado com alteração de slug e contagem de acessos
como criar um redirecionador de links no laravel com banco de dados e quando a pessoa acessar o link é direcionado com alteração de slug e contagem de acessos
Para criar um redirecionador de links no Laravel com banco de dados, onde cada link redireciona o usuário a uma URL específica e, ao mesmo tempo, conta quantas vezes o link foi acessado, você pode seguir os seguintes passos:
1. Configuração do Banco de Dados
Primeiro, vamos criar uma tabela no banco de dados para armazenar os links e suas informações (URL de destino, slug, contagem de acessos, etc.).
Passo 1: Criar a Migração
Vamos criar uma migração para a tabela links
, onde armazenaremos as informações de cada link encurtado, incluindo o slug e a contagem de acessos.
php artisan make:migration create_links_table --create=links
No arquivo da migração (database/migrations/{timestamp}_create_links_table.php
), defina a tabela com os campos necessários:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLinksTable extends Migration
{
public function up()
{
Schema::create('links', function (Blueprint $table) {
$table->id();
$table->string('slug')->unique(); // O "slug" é a URL amigável
$table->string('destination_url'); // A URL de destino
$table->integer('click_count')->default(0); // Contagem de acessos
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('links');
}
}
Depois, rode a migração para criar a tabela no banco de dados:
php artisan migrate
2. Modelo para Link
Agora, crie o modelo para interagir com a tabela links
. Execute o comando:
php artisan make:model Link
No arquivo app/Models/Link.php
, adicione as propriedades e métodos necessários:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Link extends Model
{
use HasFactory;
protected $fillable = ['slug', 'destination_url', 'click_count'];
// Método para incrementar o contador de acessos
public function incrementClickCount()
{
$this->increment('click_count');
}
}
3. Criar o Controlador
Vamos criar um controlador para gerenciar o redirecionamento e a exibição do link. Execute o comando para criar o controlador:
php artisan make:controller LinkRedirectController
No arquivo app/Http/Controllers/LinkRedirectController.php
, adicione o seguinte código:
namespace App\Http\Controllers;
use App\Models\Link;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use Symfony\Component\HttpFoundation\Response;
class LinkRedirectController extends Controller
{
/**
* Redireciona para o link de destino com base no slug.
*
* @param string $slug
* @return \Illuminate\Http\RedirectResponse
*/
public function redirect($slug)
{
// Procurar pelo link no banco de dados usando o slug
$link = Link::where('slug', $slug)->first();
if (!$link) {
// Caso o slug não exista, redireciona para uma página de erro ou página inicial
return redirect('/')->with('error', 'Link não encontrado.');
}
// Incrementar a contagem de acessos
$link->incrementClickCount();
// Redirecionar para a URL de destino
return redirect()->to($link->destination_url, Response::HTTP_MOVED_PERMANENTLY);
}
}
4. Definir a Rota
Agora, vamos definir a rota para o redirecionamento, onde o usuário acessará o link com o slug e será redirecionado para a URL de destino.
No arquivo routes/web.php
, adicione a seguinte rota:
use App\Http\Controllers\LinkRedirectController;
// Rota para redirecionamento de links com base no slug
Route::get('/{slug}', [LinkRedirectController::class, 'redirect']);
Essa rota vai capturar qualquer URL com um slug e redirecionar para a URL correspondente.
5. Criar o Formulário para Criar Links
Agora, você pode criar um formulário para gerar os links encurtados. O controlador que gerencia isso pode ser o LinkRedirectController
, ou você pode criar um controlador específico para isso.
Vamos criar um método no controlador para exibir o formulário de criação de links encurtados:
// Método para exibir o formulário de criação
public function showForm()
{
return view('create-link'); // A view do formulário
}
Agora, vamos criar a view resources/views/create-link.blade.php
para o formulário:
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Criar Link Encurtado</title>
</head>
<body>
<h1>Criar Link Encurtado</h1>
<form action="{{ route('create.link') }}" method="POST">
@csrf
<label for="destination_url">URL de destino:</label>
<input type="url" name="destination_url" id="destination_url" required>
<label for="slug">Slug (opcional):</label>
<input type="text" name="slug" id="slug">
<button type="submit">Criar Link</button>
</form>
</body>
</html>
Agora, você precisa criar uma rota para processar a criação do link:
// Rota para exibir o formulário de criação
Route::get('/criar-link', [LinkRedirectController::class, 'showForm'])->name('show.form');
// Rota para criar o link (POST)
Route::post('/criar-link', [LinkRedirectController::class, 'store'])->name('create.link');
E, no método store
do controlador, você pode criar o link e armazená-lo no banco de dados:
public function store(Request $request)
{
// Validação dos dados
$request->validate([
'destination_url' => 'required|url',
'slug' => 'nullable|alpha_dash|unique:links,slug',
]);
// Criar o link
$slug = $request->slug ?: str()->random(8); // Gerar um slug aleatório se não for informado
Link::create([
'slug' => $slug,
'destination_url' => $request->destination_url,
'click_count' => 0, // Inicializa a contagem como 0
]);
return redirect()->route('show.form')->with('success', 'Link criado com sucesso!');
}
6. Exibindo a Contagem de Acessos
Agora que temos o contador de acessos armazenado no banco de dados, você pode exibir esse valor em qualquer parte da sua aplicação.
Por exemplo, ao mostrar uma lista de links no painel administrativo ou em uma página de estatísticas, você pode exibir a contagem de acessos diretamente da tabela de links:
$links = Link::all(); // Recuperar todos os links
foreach ($links as $link) {
echo "Slug: " . $link->slug . " | Contagem de acessos: " . $link->click_count . "<br>";
}
7. Testando
Agora, ao criar um link usando o formulário, um slug será gerado ou fornecido pelo usuário. Quando alguém acessar o link (como www.exemplo.com/{slug}
), o Laravel redirecionará o usuário para a URL de destino e atualizará a contagem de acessos.
Considerações Finais
- Validação de Slug: É importante garantir que o slug seja único no banco de dados, pois isso evita colisões.
- Segurança: Tenha cuidado com links maliciosos. É uma boa prática validar a URL de destino para garantir que o redirecionamento não vá para sites de phishing ou URLs externas não seguras.
- Escalabilidade: Se o número de acessos for muito alto, considere otimizar a contagem de acessos para evitar consultas desnecessárias no banco de dados.
Essa implementação cria um redirecionador de links básico, mas pode ser expandida com mais funcionalidades, como autenticação, expiração de links, personalização de slug, etc.