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.

Posts Similares