Model kodu
`<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class VisitorTracker extends Model
{
use HasFactory;
protected $table = 'page_trackers';
protected $fillable = ['ip_address', 'user_agent', 'page_name', 'visit_duration', 'device_type'];
protected $casts = [
'visit_duration' => 'float',
'device_type' => 'integer',
];
public function getVisitDateAttribute($value)
{
return Carbon::parse($value);
}
public function getVisitTimeAttribute($value)
{
return Carbon::parse($value);
}
}
`
işte Middleware kodum
`<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Session;
use DB;
class PageTracker
{
public function setIpAddress(string $ipAddress)
{
$this->ip_address = $ipAddress;
}
public function setUserAgent(string $userAgent)
{
$this->user_agent = $userAgent;
}
public function setPageName(string $pageName)
{
$this->page_name = $pageName;
}
public function setVisitDuration(int $visitDuration)
{
$this->visit_duration = $visitDuration;
}
public function setDeviceType(int $deviceType)
{
$this->device_type = $deviceType;
}
public function save(): void
{
// Ziyaretçi bilgilerini veritabanına kaydedin
DB::table('page_trackers')->insert([
'ip_address' => $this->ip_address,
'user_agent' => $this->user_agent,
'page_name' => $this->page_name,
'visit_duration' => $this->visit_duration,
'device_type' => $this->device_type,
]);
}
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
// Ziyaretçinin IP adresini kaydet
$ip_address = $request->ip();
// Ziyaretçinin tarayıcı kimliğini kaydet
$user_agent = $request->userAgent();
// Ziyaretçinin ziyaret ettiği sayfanın adını kaydet
$page_name = $request->route()->getName();
// Ziyaretçinin sayfadaki kalma süresini kaydet
$visit_duration = $request->server('REQUEST_TIME') - $request->server('REQUEST_TIME_FLOAT');
// Kullanıcının cihaz türünü kaydet
$device_type = $this->isMobileDevice($request) ? 0 : 1;
// `page_name` bilgisini al
$page_name = $request->route()->getName();
// `route()->parameter('slug')` metodu ile slug bilgisini kontrol et
if ($slug = $request->route()->parameter('slug')) {
// Slug bilgisi varsa `page_name` olarak bunu kullan
$page_name = $slug;
}
// `tracker` özelliğini tanımla
$this->tracker = new PageTracker();
// Ziyaretçi bilgilerini kaydet
$this->tracker->setIpAddress($ip_address);
$this->tracker->setUserAgent($user_agent);
$this->tracker->setPageName($page_name);
$this->tracker->setVisitDuration(floatval($visit_duration));
$this->tracker->setDeviceType($device_type);
// Ziyaretçi bilgilerini veritabanına kaydet
$this->tracker->save();
return $next($request);
}
private function isMobileDevice($request)
{
// Kullanıcının tarayıcı kimliğinden cihaz türünü belirle
$user_agent = $request->userAgent();
$mobile_prefixes = ['android', 'iphone', 'ipad', 'ipod', 'blackberry', 'webos', 'meego', 'bada', 'symbian', 'windows phone'];
foreach ($mobile_prefixes as $mobile_prefix) {
if (strpos($user_agent, $mobile_prefix) !== false) {
return 1;
}
}
return 0;
}
}
`
buda migration
`<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('page_trackers', function (Blueprint $table) {
$table->id();
$table->string('ip_address');
$table->string('user_agent');
$table->string('page_name');
$table->float('visit_duration');
$table->integer('device_type');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('page_trackers');
}
};`
Middleware kodum gereksiz uzun geliyor ama nasıl kısaltacağımı bilmiyorum. 2 Sorum var.
1- Middleware kodumu kısaltabilir miyim? Bu ekstra bir sorumdu)
2-(Asıl sorunum) ziyaretçi her yeni sayfaya tıkladığında veritabanına bilgi kaydediliyor. ancak ilk ziyaretin tarih ve saatini alıyor. Bunu nasıl güncellerim.