Kayıtlı ya da anonim kullanıcın firma sayfasını ziyaret ettiğinde ziyaret sayısını arttırmak için şöyle bir middleware olabilir:
app/Http/Middleware/TrackVisits.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Cache\RateLimiter;
use Illuminate\Support\Facades\DB;
class TrackVisits
{
/**
* Sınırlayıcı
*
* @var \Illuminate\Cache\RateLimiter
*/
protected $limiter;
/**
* @param \Illuminate\Cache\RateLimiter $limiter
*/
public function __construct(RateLimiter $limiter)
{
$this->limiter = $limiter;
}
/**
* Gelen isteği işle
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param int $hitDelayInMinutes Aynı kullanıcı aynı URL'ye kaç dakika sonra girerse yeni ziyaret sayılacak.
* @return mixed
*/
public function handle($request, Closure $next, $hitDelayInMinutes = 60)
{
/** @var string $key URL ve ziyaretçi IPsinden oluşturulan anahtar */
$key = sha1($request->fullUrl() . '|' . $request->ip());
// Kullanıcı bu url'yi daha önce (1 kere) ziyaret etmemişse
if (!$this->limiter->tooManyAttempts($key, 1)) {
// Burada sayfanın ziyaret değerini arttırıyoruz. Örneğin:
DB::table('pages')->where('slug', $request->route('slug'))->increment('visits');
}
// Kullanıcının bu URL'yi ziyaret ettiğini önbelleğe işliyoruz. Bir dahaki girişte
// $hitDelayInMinutes kadar süre geçmemişse ziyaret sayısı artmayacak
$this->limiter->hit($key, $hitDelayInMinutes);
// İsteğe devam ediyoruz
return $next($request);
}
}
pages tablosunda ziyaret sayısını tutan visits(INT) alanı olduğunu varsaydım ve bu middleware ile o değeri arttırdım. Daha düzgün istatistik için ayrı bir tabloda ip, page_id, browser_info, visited_at gibi alanlar tutabilirsiniz.