Este paquete Laravel >= 6.0 le permite asociar vistas con modelos Eloquent.
Una vez instalado puedes hacer cosas como esta:
// Return total views count
views ( $ post )-> count ();
// Return total views count that have been made since 20 February 2017
views ( $ post )-> period (Period:: since ( ' 2017-02-20 ' ))-> count ();
// Return total views count that have been made between 2014 and 2016
views ( $ post )-> period (Period:: create ( ' 2014 ' , ' 2016 ' ))-> count ();
// Return total unique views count ( based on visitor cookie )
views ( $ post )-> unique ()-> count ();
// Record a view
views ( $ post )-> record ();
// Record a view with a cooldown
views ( $ post )-> cooldown ( now ()-> addHours ( 2 ))-> record ();
A veces no desea utilizar un servicio de terceros como Google Analytics para realizar un seguimiento de las visitas a la página de su aplicación. Entonces este paquete te resultará útil. Eloquent Viewable le permite asociar fácilmente vistas con modelos de Eloquent. Está diseñado pensando en la simplicidad.
Este paquete almacena cada registro de vista individualmente en la base de datos. La ventaja de esto es que nos permite hacer conteos muy específicos. Por ejemplo, si queremos saber cuántas personas han visto una publicación específica entre el 10 de enero y el 17 de febrero de 2018, podemos hacer lo siguiente: views($post)->period(Period::create('10-01-2018', '17-02-2018'))->count();
. La desventaja de esto es que su base de datos puede crecer rápidamente en tamaño dependiendo de la cantidad de visitantes que tenga su aplicación.
Estas son algunas de las características principales:
En esta documentación, encontrará información útil sobre el uso de este paquete Laravel.
Este paquete requiere PHP 7.4+ y Laravel 6+ .
No se mantiene la compatibilidad con Lumen.
Versión | Iluminar | Estado | Versión PHP |
---|---|---|---|
^7.0 | 6.xx-11.xx | Apoyo activo mediante aportaciones. | >= 7.4.0 |
Primero, necesitas instalar el paquete a través de Composer:
composer require cyrildewit/eloquent-viewable
En segundo lugar, puedes publicar las migraciones con:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " migrations "
Finalmente, necesitas ejecutar el comando migrate
:
php artisan migrate
Opcionalmente, puede publicar el archivo de configuración con:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " config "
Si prefiere registrar paquetes manualmente, puede agregar el siguiente proveedor a la lista de proveedores de su aplicación.
// config/app.php
' providers ' => [
// ...
CyrildeWit EloquentViewable EloquentViewableServiceProvider::class,
];
Para asociar vistas con un modelo, el modelo debe implementar la siguiente interfaz y característica:
CyrildeWitEloquentViewableContractsViewable
CyrildeWitEloquentViewableInteractsWithViews
Ejemplo:
use Illuminate Database Eloquent Model ;
use CyrildeWit EloquentViewable InteractsWithViews ;
use CyrildeWit EloquentViewable Contracts Viewable ;
class Post extends Model implements Viewable
{
use InteractsWithViews;
// ...
}
Para crear un registro de vista, puede llamar al método record
en la instancia de Views
fluidas.
views ( $ post )-> record ();
El mejor lugar donde deberías registrar la vista de los visitantes sería dentro de tu controlador. Por ejemplo:
// PostController . php
public function show ( Post $ post )
{
views ( $ post )-> record ();
return view ( ' post.show ' , compact ( ' post ' ));
}
Nota: este paquete filtra los rastreadores de forma predeterminada. Tenga esto en cuenta al realizar la prueba, porque Postman, por ejemplo, también es un rastreador.
Puede utilizar el método cooldown
en la instancia Views
para agregar un tiempo de recuperación entre los registros de vista. Cuando estableces un tiempo de reutilización, debes especificar la cantidad de minutos.
views ( $ post )
-> cooldown ( $ minutes )
-> record ();
En lugar de pasar la cantidad de minutos como un número entero, también puede pasar una instancia DateTimeInterface
.
$ expiresAt = now ()-> addHours ( 3 );
views ( $ post )
-> cooldown ( $ expiresAt )
-> record ();
Al grabar una vista con un retraso en la sesión, este paquete también guardará una instantánea de la vista en la sesión del visitante con una fecha y hora de vencimiento. Cada vez que el visitante vuelva a ver el elemento, este paquete verificará su sesión y decidirá si la vista debe guardarse en la base de datos o no.
views ( $ post )-> count ();
use CyrildeWit EloquentViewable Support Period ;
// Example : get views count from 2017 upto 2018
views ( $ post )
-> period (Period:: create ( ' 2017 ' , ' 2018 ' ))
-> count ();
La clase Period
que viene con este paquete proporciona muchas funciones útiles. La API de la clase Period
tiene el siguiente aspecto:
$ startDateTime = Carbon:: createFromDate ( 2017 , 4 , 12 );
$ endDateTime = ' 2017-06-12 ' ;
Period:: create ( $ startDateTime , $ endDateTime );
Period:: since (Carbon:: create ( 2017 ));
Period:: upto (Carbon:: createFromDate ( 2018 , 6 , 1 ));
Utiliza Carbon::today()
como fecha y hora de inicio menos la unidad dada.
Period:: pastDays (int $ days );
Period:: pastWeeks (int $ weeks );
Period:: pastMonths (int $ months );
Period:: pastYears (int $ years );
Utiliza Carbon::now()
como fecha y hora de inicio menos la unidad dada.
Period:: subSeconds (int $ seconds );
Period:: subMinutes (int $ minutes );
Period:: subHours (int $ hours );
Period:: subDays (int $ days );
Period:: subWeeks (int $ weeks );
Period:: subMonths (int $ months );
Period:: subYears (int $ years );
Si solo desea recuperar el recuento de vistas únicas, simplemente puede agregar el método unique
a la cadena.
views ( $ post )
-> unique ()
-> count ();
El rasgo Viewable
agrega dos ámbitos a su modelo: orderByViews
y orderByUniqueViews
.
Post:: orderByViews ()-> get (); // descending
Post:: orderByViews ( ' asc ' )-> get (); // ascending
Post:: orderByUniqueViews ()-> get (); // descending
Post:: orderByUniqueViews ( ' asc ' )-> get (); // ascending
Post:: orderByViews ( ' asc ' , Period:: pastDays ( 3 ))-> get (); // descending
Post:: orderByViews ( ' desc ' , Period:: pastDays ( 3 ))-> get (); // ascending
Y por supuesto, también es posible con la variante de vistas únicas:
Post:: orderByUniqueViews ( ' asc ' , Period:: pastDays ( 3 ))-> get (); // descending
Post:: orderByUniqueViews ( ' desc ' , Period:: pastDays ( 3 ))-> get (); // ascending
Post:: orderByViews ( ' asc ' , null , ' custom-collection ' )-> get (); // descending
Post:: orderByViews ( ' desc ' , null , ' custom-collection ' )-> get (); // ascending
Post:: orderByUniqueViews ( ' asc ' , null , ' custom-collection ' )-> get (); // descending
Post:: orderByUniqueViews ( ' desc ' , null , ' custom-collection ' )-> get (); // ascending
Si desea saber cuántas vistas tiene un tipo visible específico, debe pasar un modelo Eloquent vacío al asistente views()
de esta manera:
views ( new Post ())-> count ();
También puede pasar un nombre de clase completo. Luego, el paquete resolverá una instancia del contenedor de la aplicación.
views (Post::class)-> count ();
views ( ' AppPost ' )-> count ();
Si tiene diferentes tipos de vistas para el mismo tipo visible, es posible que desee almacenarlas en su propia colección.
views ( $ post )
-> collection ( ' customCollection ' )
-> record ();
Para recuperar el recuento de vistas en una colección específica, puede reutilizar el mismo método collection()
.
views ( $ post )
-> collection ( ' customCollection ' )
-> count ();
Para eliminar automáticamente todas las vistas de un modelo Eloquent visible al eliminarlo, puede habilitarlo estableciendo la propiedad removeViewsOnDelete
en true
en la definición de su modelo.
protected $ removeViewsOnDelete = true ;
Almacenar en caché el recuento de vistas puede resultar complicado en algunos escenarios. El período puede ser, por ejemplo, dinámico, lo que hace que el almacenamiento en caché no sea posible. Es por eso que puede utilizar la función de almacenamiento en caché incorporada.
Para almacenar en caché el recuento de vistas, simplemente agregue el método remember()
a la cadena. La vida útil predeterminada es para siempre.
Ejemplos:
views ( $ post )-> remember ()-> count ();
views ( $ post )-> period (Period:: create ( ' 2018-01-24 ' , ' 2018-05-22 ' ))-> remember ()-> count ();
views ( $ post )-> period (Period:: upto ( ' 2018-11-10 ' ))-> unique ()-> remember ()-> count ();
views ( $ post )-> period (Period:: pastMonths ( 2 ))-> remember ()-> count ();
views ( $ post )-> period (Period:: subHours ( 6 ))-> remember ()-> count ();
// Cache for 3600 seconds
views ( $ post )-> remember ( 3600 )-> count ();
// Cache until the defined DateTime
views ( $ post )-> remember ( now ()-> addWeeks ( 2 ))-> count ();
// Cache forever
views ( $ post )-> remember ()-> count ();
El archivo de migración de la tabla de views
predeterminada ya tiene dos índices para viewable_id
y viewable_type
.
Si tiene suficiente almacenamiento disponible, puede agregar otro índice para la columna visitor
. Dependiendo de la cantidad de visitas, esto puede acelerar tus consultas en algunos casos.
El recuento de vistas del almacenamiento en caché puede tener un gran impacto en el rendimiento de su aplicación. Puede leer la documentación sobre el almacenamiento en caché del recuento de vistas aquí.
El uso del método remember()
solo almacenará en caché los recuentos de vistas realizados por el método count()
. Los alcances de consulta orderByViews
y orderByUnique
no utilizan estos valores porque solo agregan algo al generador de consultas. Para optimizar estas consultas, puede agregar una columna adicional o varias columnas a su tabla de base de datos visible con estos recuentos.
Ejemplo: queremos ordenar las publicaciones de nuestro blog por recuento de vistas únicas . Lo primero que se le puede ocurrir es utilizar el alcance de consulta orderByUniqueViews
.
$ posts = Post:: latest ()-> orderByUniqueViews ()-> paginate ( 20 );
Esta consulta es bastante lenta cuando tienes muchas vistas almacenadas. Para acelerar las cosas, puede agregar, por ejemplo, una columna unique_views_count
a su tabla de posts
. Tendremos que actualizar esta columna periódicamente con el recuento de vistas únicas. Esto se puede lograr fácilmente usando un comando programado de Laravel.
Puede haber una forma más rápida de hacer esto, pero dicho comando puede ser como:
$ posts = Post:: all ();
foreach ( $ posts as $ post ) {
$ post -> unique_views_count = views ( $ post )-> unique ()-> count ();
}
Si desea ampliar o reemplazar una de las clases principales con sus propias implementaciones, puede anularlas:
CyrildeWitEloquentViewableViews
CyrildeWitEloquentViewableView
CyrildeWitEloquentViewableVisitor
CyrildeWitEloquentViewableCrawlerDetectAdapter
Nota: No olvide que todas las clases personalizadas deben implementar sus interfaces originales.
La clase Visitor
es responsable de proporcionar al generador de Views
información sobre el visitante actual. Se proporciona la siguiente información:
La clase Visitor
predeterminada obtiene su información de la solicitud. Por lo tanto, puede experimentar algunos problemas al utilizar el generador Views
a través de una API RESTful. Para solucionar esto, deberá proporcionar sus propios datos sobre el visitante.
Puede anular la clase Visitor
de forma global o local.
Visitor
Cree su propia clase Visitor
en su aplicación Laravel e implemente la interfaz CyrildeWitEloquentViewableContractsVisitor
. Cree los métodos requeridos por la interfaz.
Alternativamente, puede ampliar la clase Visitor
predeterminada que viene con este paquete.
Simplemente vincule su implementación Visitor
personalizada al contrato CyrildeWitEloquentViewableContractsVisitor
.
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Visitor::class,
App Services Views Visitor::class
);
También puede configurar la instancia de visitante utilizando el método de configuración useVisitor
en el generador Views
.
use App Services Views Visitor ;
views ( $ post )
-> useVisitor ( new Visitor ()) // or app ( Visitor::class )
-> record ();
Views
Eloquent Vincule su implementación Views
personalizadas a CyrildeWitEloquentViewableContractsViews
.
Cambie el siguiente fragmento de código y colóquelo en el método register
de un proveedor de servicios (por ejemplo, AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Views::class,
App Services Views Views::class
);
View
Eloquent Vincule su implementación View
personalizada a CyrildeWitEloquentViewableContractsView
.
Cambie el siguiente fragmento de código y colóquelo en el método register
de un proveedor de servicios (por ejemplo, AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts View::class,
App Models View::class
);
Vincule su implementación personalizada CrawlerDetector
a CyrildeWitEloquentViewableContractsCrawlerDetector
.
Cambie el siguiente fragmento de código y colóquelo en el método register
de un proveedor de servicios (por ejemplo, AppServiceProvider
).
$ this -> app -> singleton (
CyrildeWit EloquentViewable Contracts CrawlerDetector::class,
App Services Views CustomCrawlerDetectorAdapter::class
);
Views
use CyrildeWit EloquentViewable Views ;
Views:: macro ( ' countAndRemember ' , function () {
return $ this -> remember ()-> count ();
});
Ahora puedes usar esta abreviatura de esta manera:
views ( $ post )-> countAndRemember ();
Views:: forViewable ( $ post )-> countAndRemember ();
Consulte ACTUALIZACIÓN para obtener una guía de actualización detallada.
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
Consulte CONTRIBUCIÓN para obtener más detalles.
Vea también la lista de contribuyentes que participaron en este proyecto.
Recursos útiles:
¡Siéntete libre de agregar más alternativas!
Este proyecto tiene la licencia MIT; consulte el archivo de LICENCIA para obtener más detalles.