Создание статистики посещений в Laravel: отслеживание IP-адреса, URL и местоположения

Шаг 1: Создание модели и миграции для таблицы посещений

Создадим модель Visit и миграцию для таблицы visits с помощью флага -m:

php artisan make:model Visit -m

Отредактируем созданную миграцию для таблицы visits:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateVisitsTable extends Migration
{
    public function up()
    {
        Schema::create('visits', function (Blueprint $table) {
            $table->id();
            $table->string('ip_address');
            $table->string('referer')->nullable();
            $table->string('url');
            $table->string('country')->nullable();
            $table->string('city')->nullable();
            $table->timestamp('visited_at')->default(now());
            // Другие поля, которые вы хотите добавить
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('visits');
    }
}

Выполним миграцию для создания таблицы в базе данных:

php artisan migrate

Шаг 2: Middleware для отслеживания посещений

Создадим middleware для отслеживания посещений:

php artisan make:middleware TrackVisits

Обновим middleware TrackVisits для сохранения данных о посещении:

namespace App\Http\Middleware;

use Closure;
use App\Models\Visit;
use Illuminate\Support\Facades\Request;
use Stevebauman\Location\Facades\Location;

class TrackVisits
{
    public function handle($request, Closure $next)
    {
        $ip = Request::ip();
        $referer = Request::server('HTTP_REFERER');
        $url = $request->url();

        $location = Location::get($ip);
        $country = $location->countryName ?? null;
        $city = $location->cityName ?? null;

        Visit::create([
            'ip_address' => $ip,
            'referer' => $referer,
            'url' => $url,
            'country' => $country,
            'city' => $city,
            'visited_at' => now(),
        ]);

        return $next($request);
    }
}

Для определения местоположения по IP-адресу мы используем пакет Laravel GeoIP. Установим его:

composer require stevebauman/location

Этот пакет позволяет получить информацию о местоположении, используя IP-адрес. Пожалуйста, обратите внимание, что для его работы может потребоваться настройка дополнительных сервисов или API-ключей, если таковые необходимы.

Шаг 3: Применение middleware к маршрутам

Применим созданный middleware к маршрутам, где мы хотим отслеживать посещения:

// Пример применения middleware к группе маршрутов в routes/web.php
Route::group(['middleware' => 'trackvisits'], function () {
    // Ваши маршруты здесь
});

Шаг 4: Вывод данных о посещениях на странице

Добавим метод в контроллер для вывода информации о посещениях:

namespace App\Http\Controllers;

use App\Models\Visit;
use Illuminate\Http\Request;

class VisitController extends Controller
{
    public function index()
    {
        $visits = Visit::orderByDesc('visited_at')->paginate(10);
        return view('visits.index', compact('visits'));
    }
}

Создадим представление для отображения посещений:

<!-- resources/views/visits/index.blade.php -->

@extends('layouts.app')

@section('content')
    <h1>Список посещений</h1>
    <ul>
        @foreach($visits as $visit)
            <li>
                IP: {{ $visit->ip_address }} -
                URL: {{ $visit->url }} -
                Местоположение: {{ $visit->city }}, {{ $visit->country }} -
                Посещено: {{ $visit->visited_at }}
            </li>
        @endforeach
    </ul>
    {{ $visits->links() }}
@endsection

Шаг 5: Роутинг для контроллера посещений

Добавим маршрут для контроллера VisitController:

// routes/web.php

use App\Http\Controllers\VisitController;

Route::get('/visits', [VisitController::class, 'index'])->name('visits.index');

Теперь при посещении маршрута /visits будет отображаться список посещений с IP-адресами, URL, местоположением и временем посещения. Это позволит вам анализировать активность пользователей на вашем веб-сайте.

Комментарии

Коментарии отсутствуют, будьте первым(ой) кто напишет под этим постом!

Написать коментарий