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-viewableEn segundo lugar, puedes publicar las migraciones con:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " migrations " Finalmente, necesitas ejecutar el comando migrate :
php artisan migrateOpcionalmente, 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:
CyrildeWitEloquentViewableContractsViewableCyrildeWitEloquentViewableInteractsWithViewsEjemplo:
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 (); // ascendingY 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:
CyrildeWitEloquentViewableViewsCyrildeWitEloquentViewableViewCyrildeWitEloquentViewableVisitorCyrildeWitEloquentViewableCrawlerDetectAdapterNota: 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.