Saltar al contenido

Contador de visitantes de Laravel

Siéntete en la libertad de compartir nuestro espacio y códigos con tus amigos, ayúdanos a ampliar esta comunidad.

Solución:

No estoy 100% seguro de esto, pero deberías poder hacer algo como esto. No está probado y puede haber una manera más elegante de hacerlo, pero es un punto de partida para usted.

cambia la mesa

Cambiar el visit_date (datetime) columna en visit_date (date) y visit_time (time) columnas, luego crea un id columna para ser la primaria key. Por último, establezca ip + date ser unico key para asegurarse de que no puede tener la misma IP ingresada dos veces por día.

Crear un modelo Elocuente

Esto es solo para facilitar: cree un modelo Eloquent para la tabla para que no tenga que usar Fluent (constructor de consultas) todo el tiempo:

class Tracker extends Eloquent 

    public $attributes = [ 'hits' => 0 ];

    protected $fillable = [ 'ip', 'date' ];
    protected $table = 'table_name';

    public static function boot() 
        // Any time the instance is updated (but not created)
        static::saving( function ($tracker) 
            $tracker->visit_time = date('H:i:s');
            $tracker->hits++;
         );
    

    public static function hit() 
        static::firstOrCreate([
                  'ip'   => $_SERVER['REMOTE_ADDR'],
                  'date' => date('Y-m-d'),
              ])->save();
    


Ahora deberías poder hacer lo que quieras simplemente llamando a esto:

Tracker::hit();

Mirando su código y leyendo su descripción, asumo que desea calcular la cantidad de visitas de una dirección IP por día. Podrías hacer esto usando Eloquent’s updateOrNew() método:

$ip = Request::getClientIp();
$visit_date = Carbon::now()->toDateString();

$visitor = Visitor::findOrNew(compact('ip', 'visit_date'));
$visitor->increment('hits');

Sin embargo, agregaría esto a una cola para que no acceda a la base de datos en cada solicitud y se pueda incrementar el número de visitas a través de un proceso en segundo plano:

Queue::push('RecordVisit', compact('ip', 'visit_date'));

En términos de dónde iniciar esto, el App::before() el filtro suena como un buen candidato:

App::before(function($request)
{
    $ip = $request->getClientIp();
    $visit_date = Carbon::now()->toDateString();

    Queue::push('RecordVisit', compact('ip', 'visit_date'));
);

Puede ir un paso más allá escuchando este evento en un proveedor de servicios y activando su cola de trabajo allí, de modo que su contador de visitas sea su propio componente autónomo y pueda agregarse o eliminarse fácilmente de este y cualquier otro proyecto.

¡Gracias a @Joe por ayudarme por completo!

@Martin, también gracias, pero los scripts de @Joe funcionaron para mi problema.

La solución:

Tracker::hit();

Dentro de mi aplicación::before();

Y una nueva clase:

 0];

    protected $fillable = ['ip', 'date'];

    public $timestamps = false;

    protected $table = 'visitor';

    public static function boot() 
        // When a new instance of this model is created...
        static::creating(function ($tracker) 
            $tracker->hits = 0;
         );

        // Any time the instance is saved (create OR update)
        static::saving(function ($tracker) 
            $tracker->visit_date = date('Y-m-d');
            $tracker->visit_time = date('H:i:s');
            $tracker->hits++;
         );
    

    // Fill in the IP and today's date
    public function scopeCurrent($query) 
        return $query->where('ip', $_SERVER['REMOTE_ADDR'])
                     ->where('date', date('Y-m-d'));
    

    public static function hit() 
        static::firstOrCreate([
                  'ip'   => $_SERVER['REMOTE_ADDR'],
                  'date' => date('Y-m-d'),
              ])->save();
    

Llamado ‘rastreador’ 🙂

Si te gusta la idea, eres capaz de dejar un post acerca de qué le añadirías a esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *