Ce package Laravel >= 6.0 vous permet d'associer des vues à des modèles Eloquent.
Une fois installé, vous pouvez faire des choses comme ceci :
// 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 ();
Parfois, vous ne souhaitez pas faire appel à un service tiers tel que Google Analytics pour suivre les pages vues de votre application. Alors ce package est très pratique. Eloquent Viewable vous permet d'associer facilement des vues aux modèles Eloquent. Il est conçu dans un souci de simplicité.
Ce package stocke chaque enregistrement de vue individuellement dans la base de données. L’avantage est que cela nous permet de faire des décomptes très précis. Par exemple, si nous voulons savoir combien de personnes ont consulté une publication spécifique entre le 10 janvier et le 17 février 2018, nous pouvons procéder comme suit : views($post)->period(Period::create('10-01-2018', '17-02-2018'))->count();
. L’inconvénient est que la taille de votre base de données peut croître rapidement en fonction du nombre de visiteurs de votre application.
Voici quelques-unes des principales caractéristiques :
Dans cette documentation, vous trouverez des informations utiles sur l'utilisation de ce package Laravel.
Ce package nécessite PHP 7.4+ et Laravel 6+ .
La prise en charge de Lumen n’est pas maintenue.
Version | Éclairer | Statut | Version PHP |
---|---|---|---|
^7.0 | 6.xx - 11.xx | Soutien actif par les cotisations | >= 7.4.0 |
Tout d'abord, vous devez installer le package via Composer :
composer require cyrildewit/eloquent-viewable
Deuxièmement, vous pouvez publier les migrations avec :
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " migrations "
Enfin, vous devez exécuter la commande migrate
:
php artisan migrate
Vous pouvez éventuellement publier le fichier de configuration avec :
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " config "
Si vous préférez enregistrer les packages manuellement, vous pouvez ajouter le fournisseur suivant à la liste des fournisseurs de votre application.
// config/app.php
' providers ' => [
// ...
CyrildeWit EloquentViewable EloquentViewableServiceProvider::class,
];
Pour associer des vues à un modèle, le modèle doit implémenter l'interface et le trait suivants :
CyrildeWitEloquentViewableContractsViewable
CyrildeWitEloquentViewableInteractsWithViews
Exemple:
use Illuminate Database Eloquent Model ;
use CyrildeWit EloquentViewable InteractsWithViews ;
use CyrildeWit EloquentViewable Contracts Viewable ;
class Post extends Model implements Viewable
{
use InteractsWithViews;
// ...
}
Pour créer un enregistrement de vue, vous pouvez appeler la méthode record
sur l'instance Views
fluide.
views ( $ post )-> record ();
Le meilleur endroit où vous devriez enregistrer le point de vue d’un visiteur serait à l’intérieur de votre contrôleur. Par exemple:
// PostController . php
public function show ( Post $ post )
{
views ( $ post )-> record ();
return view ( ' post.show ' , compact ( ' post ' ));
}
Remarque : Ce package filtre les robots d'exploration par défaut. Soyez-en conscient lors des tests, car Postman est par exemple aussi un robot d'exploration.
Vous pouvez utiliser la méthode cooldown
sur l'instance Views
pour ajouter un cooldown entre les enregistrements de vue. Lorsque vous définissez un temps de recharge, vous devez spécifier le nombre de minutes.
views ( $ post )
-> cooldown ( $ minutes )
-> record ();
Au lieu de transmettre le nombre de minutes sous forme d'entier, vous pouvez également transmettre une instance DateTimeInterface
.
$ expiresAt = now ()-> addHours ( 3 );
views ( $ post )
-> cooldown ( $ expiresAt )
-> record ();
Lors de l'enregistrement d'une vue avec un délai de session, ce package enregistrera également un instantané de la vue dans la session du visiteur avec une date/heure d'expiration. Chaque fois que le visiteur consulte à nouveau l'élément, ce package vérifie sa session et décide si la vue doit être enregistrée dans la base de données ou non.
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 classe Period
fournie avec ce package offre de nombreuses fonctionnalités pratiques. L'API de la classe Period
se présente comme suit :
$ 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 ));
Utilise Carbon::today()
comme date/heure de début moins l'unité donnée.
Period:: pastDays (int $ days );
Period:: pastWeeks (int $ weeks );
Period:: pastMonths (int $ months );
Period:: pastYears (int $ years );
Utilise Carbon::now()
comme date/heure de début moins l'unité donnée.
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 vous souhaitez uniquement récupérer le nombre de vues uniques, vous pouvez simplement ajouter la méthode unique
à la chaîne.
views ( $ post )
-> unique ()
-> count ();
Le trait Viewable
ajoute deux étendues à votre modèle : orderByViews
et 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
Et bien sûr, c'est également possible avec la variante de vues uniques :
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 vous souhaitez savoir combien de vues possède un type visible spécifique, vous devez transmettre un modèle Eloquent vide à l'assistant views()
comme ceci :
views ( new Post ())-> count ();
Vous pouvez également transmettre un nom de classe complet. Le package résoudra ensuite une instance à partir du conteneur d’application.
views (Post::class)-> count ();
views ( ' AppPost ' )-> count ();
Si vous disposez de différents types de vues pour le même type visible, vous souhaiterez peut-être les stocker dans leur propre collection.
views ( $ post )
-> collection ( ' customCollection ' )
-> record ();
Pour récupérer le nombre de vues dans une collection spécifique, vous pouvez réutiliser la même méthode collection()
.
views ( $ post )
-> collection ( ' customCollection ' )
-> count ();
Pour supprimer automatiquement toutes les vues d'un modèle Eloquent visible lors de la suppression, vous pouvez l'activer en définissant la propriété removeViewsOnDelete
sur true
dans la définition de votre modèle.
protected $ removeViewsOnDelete = true ;
La mise en cache du nombre de vues peut être difficile dans certains scénarios. La période peut être par exemple dynamique ce qui rend la mise en cache impossible. C'est pourquoi vous pouvez utiliser la fonctionnalité de mise en cache intégrée.
Pour mettre en cache le nombre de vues, ajoutez simplement la méthode remember()
à la chaîne. La durée de vie par défaut est éternelle.
Exemples :
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 ();
Le fichier de migration de table views
par défaut possède déjà deux index pour viewable_id
et viewable_type
.
Si vous disposez de suffisamment de stockage disponible, vous pouvez ajouter un autre index pour la colonne visitor
. En fonction du nombre de vues, cela peut accélérer vos requêtes dans certains cas.
Le nombre de vues mises en cache peut avoir un impact important sur les performances de votre application. Vous pouvez lire la documentation sur la mise en cache du nombre de vues ici
L’utilisation de la méthode remember()
mettra uniquement en cache le nombre de vues effectué par la méthode count()
. Les étendues de requête orderByViews
et orderByUnique
n'utilisent pas ces valeurs car elles ajoutent uniquement quelque chose au générateur de requêtes. Pour optimiser ces requêtes, vous pouvez ajouter une ou plusieurs colonnes supplémentaires à votre table de base de données visible avec ces nombres.
Exemple : nous souhaitons classer nos articles de blog en fonction du nombre de vues uniques . La première chose qui peut vous venir à l’esprit est d’utiliser la portée de requête orderByUniqueViews
.
$ posts = Post:: latest ()-> orderByUniqueViews ()-> paginate ( 20 );
Cette requête est assez lente lorsque de nombreuses vues sont stockées. Pour accélérer les choses, vous pouvez ajouter par exemple une colonne unique_views_count
à votre table posts
. Nous devrons mettre à jour cette colonne périodiquement avec le nombre de vues uniques. Cela peut facilement être réalisé à l'aide d'une commande Laravel planifiée.
Il existe peut-être un moyen plus rapide de procéder, mais cette commande peut ressembler à :
$ posts = Post:: all ();
foreach ( $ posts as $ post ) {
$ post -> unique_views_count = views ( $ post )-> unique ()-> count ();
}
Si vous souhaitez étendre ou remplacer l'une des classes principales par vos propres implémentations, vous pouvez les remplacer :
CyrildeWitEloquentViewableViews
CyrildeWitEloquentViewableView
CyrildeWitEloquentViewableVisitor
CyrildeWitEloquentViewableCrawlerDetectAdapter
Remarque : n'oubliez pas que toutes les classes personnalisées doivent implémenter leurs interfaces d'origine
La classe Visitor
est chargée de fournir au générateur Views
des informations sur le visiteur actuel. Les informations suivantes sont fournies :
La classe Visitor
par défaut obtient ses informations à partir de la requête. Par conséquent, vous pouvez rencontrer certains problèmes lors de l'utilisation du générateur Views
via une API RESTful. Pour résoudre ce problème, vous devrez fournir vos propres données sur le visiteur.
Vous pouvez remplacer la classe Visitor
globalement ou localement.
Visitor
Créez votre propre classe Visitor
dans votre application Laravel et implémentez l'interface CyrildeWitEloquentViewableContractsVisitor
. Créez les méthodes requises par l'interface.
Vous pouvez également étendre la classe Visitor
par défaut fournie avec ce package.
Liez simplement votre implémentation Visitor
personnalisée au contrat CyrildeWitEloquentViewableContractsVisitor
.
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Visitor::class,
App Services Views Visitor::class
);
Vous pouvez également définir l'instance de visiteur à l'aide de la méthode de définition useVisitor
sur le générateur Views
.
use App Services Views Visitor ;
views ( $ post )
-> useVisitor ( new Visitor ()) // or app ( Visitor::class )
-> record ();
Views
Eloquent Liez votre implémentation Views
personnalisée au CyrildeWitEloquentViewableContractsViews
.
Modifiez l'extrait de code suivant et placez-le dans la méthode register
chez un fournisseur de services (par exemple AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Views::class,
App Services Views Views::class
);
View
Eloquent Liez votre implémentation View
personnalisée au CyrildeWitEloquentViewableContractsView
.
Modifiez l'extrait de code suivant et placez-le dans la méthode register
chez un fournisseur de services (par exemple AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts View::class,
App Models View::class
);
Liez votre implémentation personnalisée CrawlerDetector
au CyrildeWitEloquentViewableContractsCrawlerDetector
.
Modifiez l'extrait de code suivant et placez-le dans la méthode register
chez un fournisseur de services (par exemple 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 ();
});
Vous pouvez maintenant utiliser ce raccourci comme ceci :
views ( $ post )-> countAndRemember ();
Views:: forViewable ( $ post )-> countAndRemember ();
Veuillez consulter MISE À NIVEAU pour un guide de mise à niveau détaillé.
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
Veuillez consulter CONTRIBUER pour plus de détails.
Voir aussi la liste des contributeurs ayant participé à ce projet.
Ressources utiles :
N'hésitez pas à ajouter d'autres alternatives !
Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.