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-viewableDeuxiè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 migrateVous 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 :
CyrildeWitEloquentViewableContractsViewableCyrildeWitEloquentViewableInteractsWithViewsExemple:
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 (); // ascendingEt 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 :
CyrildeWitEloquentViewableViewsCyrildeWitEloquentViewableViewCyrildeWitEloquentViewableVisitorCyrildeWitEloquentViewableCrawlerDetectAdapterRemarque : 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.