Mit diesem Laravel >= 6.0-Paket können Sie Ansichten mit Eloquent-Modellen verknüpfen.
Nach der Installation können Sie Folgendes tun:
// 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 ();
Manchmal möchten Sie keinen Drittanbieterdienst wie Google Analytics nutzen, um die Seitenaufrufe Ihrer Anwendung zu verfolgen. Dann ist dieses Paket genau das Richtige für Sie. Mit Eloquent Viewable können Sie ganz einfach Ansichten mit Eloquent-Modellen verknüpfen. Es ist auf Einfachheit ausgelegt.
Dieses Paket speichert jeden Ansichtsdatensatz einzeln in der Datenbank. Dies hat den Vorteil, dass wir sehr spezifische Zählungen durchführen können. Wenn wir beispielsweise wissen möchten, wie viele Personen zwischen dem 10. Januar und dem 17. Februar 2018 einen bestimmten Beitrag angesehen haben, können wir Folgendes tun: views($post)->period(Period::create('10-01-2018', '17-02-2018'))->count();
. Der Nachteil dabei ist, dass Ihre Datenbank abhängig von der Anzahl der Besucher, die Ihre Anwendung hat, schnell wachsen kann.
Hier sind einige der Hauptfunktionen:
In dieser Dokumentation finden Sie einige hilfreiche Informationen zur Verwendung dieses Laravel-Pakets.
Dieses Paket erfordert PHP 7.4+ und Laravel 6+ .
Die Unterstützung für Lumen wird nicht aufrechterhalten.
Version | Beleuchten | Status | PHP-Version |
---|---|---|---|
^7.0 | 6.xx - 11.xx | Aktive Unterstützung durch Beiträge | >= 7.4.0 |
Zuerst müssen Sie das Paket über Composer installieren:
composer require cyrildewit/eloquent-viewable
Zweitens können Sie die Migrationen veröffentlichen mit:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " migrations "
Abschließend müssen Sie den migrate
ausführen:
php artisan migrate
Sie können die Konfigurationsdatei optional veröffentlichen mit:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " config "
Wenn Sie Pakete lieber manuell registrieren möchten, können Sie den folgenden Anbieter zur Anbieterliste Ihrer Anwendung hinzufügen.
// config/app.php
' providers ' => [
// ...
CyrildeWit EloquentViewable EloquentViewableServiceProvider::class,
];
Um Ansichten einem Modell zuzuordnen, muss das Modell die folgende Schnittstelle und Eigenschaft implementieren:
CyrildeWitEloquentViewableContractsViewable
CyrildeWitEloquentViewableInteractsWithViews
Beispiel:
use Illuminate Database Eloquent Model ;
use CyrildeWit EloquentViewable InteractsWithViews ;
use CyrildeWit EloquentViewable Contracts Viewable ;
class Post extends Model implements Viewable
{
use InteractsWithViews;
// ...
}
Um einen Ansichtsdatensatz zu erstellen, können Sie die record
für die Fluent Views
Instanz aufrufen.
views ( $ post )-> record ();
Der beste Ort, an dem Sie die Sicht eines Besuchers aufzeichnen sollten, ist in Ihrem Controller. Zum Beispiel:
// PostController . php
public function show ( Post $ post )
{
views ( $ post )-> record ();
return view ( ' post.show ' , compact ( ' post ' ));
}
Hinweis: Dieses Paket filtert Crawler standardmäßig heraus. Beachten Sie dies beim Testen, da Postman beispielsweise auch ein Crawler ist.
Sie können die cooldown
-Methode für die Views
-Instanz verwenden, um eine Cooldown-Zeit zwischen den Ansichtsdatensätzen hinzuzufügen. Wenn Sie eine Abklingzeit festlegen, müssen Sie die Anzahl der Minuten angeben.
views ( $ post )
-> cooldown ( $ minutes )
-> record ();
Anstatt die Anzahl der Minuten als Ganzzahl zu übergeben, können Sie auch eine DateTimeInterface
Instanz übergeben.
$ expiresAt = now ()-> addHours ( 3 );
views ( $ post )
-> cooldown ( $ expiresAt )
-> record ();
Wenn eine Ansicht mit einer Sitzungsverzögerung aufgezeichnet wird, speichert dieses Paket auch einen Schnappschuss der Ansicht in der Sitzung des Besuchers mit einem Ablaufdatum und einer Uhrzeit. Immer wenn der Besucher den Artikel erneut ansieht, überprüft dieses Paket seine Sitzung und entscheidet, ob die Ansicht in der Datenbank gespeichert werden soll oder nicht.
views ( $ post )-> count ();
use CyrildeWit EloquentViewable Support Period ;
// Example : get views count from 2017 upto 2018
views ( $ post )
-> period (Period:: create ( ' 2017 ' , ' 2018 ' ))
-> count ();
Die in diesem Paket enthaltene Period
Klasse bietet viele praktische Funktionen. Die API der Period
-Klasse sieht wie folgt aus:
$ 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 ));
Verwendet Carbon::today()
als Startdatum/Uhrzeit minus der angegebenen Einheit.
Period:: pastDays (int $ days );
Period:: pastWeeks (int $ weeks );
Period:: pastMonths (int $ months );
Period:: pastYears (int $ years );
Verwendet Carbon::now()
als Startdatum/Uhrzeit minus der angegebenen Einheit.
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 );
Wenn Sie nur die Anzahl der eindeutigen Aufrufe abrufen möchten, können Sie einfach die Methode unique
zur Kette hinzufügen.
views ( $ post )
-> unique ()
-> count ();
Das Viewable
Merkmal fügt Ihrem Modell zwei Bereiche hinzu: orderByViews
und 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
Und natürlich geht es auch mit der Variante „Unique Views“:
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
Wenn Sie wissen möchten, wie viele Ansichten ein bestimmter sichtbarer Typ hat, müssen Sie ein leeres Eloquent-Modell wie folgt an den views()
-Helfer übergeben:
views ( new Post ())-> count ();
Sie können auch einen vollständig qualifizierten Klassennamen übergeben. Das Paket löst dann eine Instanz aus dem Anwendungscontainer auf.
views (Post::class)-> count ();
views ( ' AppPost ' )-> count ();
Wenn Sie unterschiedliche Arten von Ansichten für denselben sichtbaren Typ haben, möchten Sie diese möglicherweise in einer eigenen Sammlung speichern.
views ( $ post )
-> collection ( ' customCollection ' )
-> record ();
Um die Anzahl der Aufrufe in einer bestimmten Sammlung abzurufen, können Sie dieselbe Methode collection()
wiederverwenden.
views ( $ post )
-> collection ( ' customCollection ' )
-> count ();
Um beim Löschen automatisch alle Ansichten eines sichtbaren Eloquent-Modells zu löschen, können Sie dies aktivieren, indem Sie in Ihrer Modelldefinition die Eigenschaft removeViewsOnDelete
auf true
setzen.
protected $ removeViewsOnDelete = true ;
Das Zwischenspeichern der Anzahl der Aufrufe kann in manchen Szenarien eine Herausforderung darstellen. Der Zeitraum kann beispielsweise dynamisch sein, wodurch ein Caching nicht möglich ist. Aus diesem Grund können Sie die integrierte Caching-Funktion nutzen.
Um die Anzahl der Aufrufe zwischenzuspeichern, fügen Sie einfach die Methode remember()
zur Kette hinzu. Die Standardlebensdauer ist ewig.
Beispiele:
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 ();
Die Migrationsdatei für views
verfügt bereits über zwei Indizes für viewable_id
und viewable_type
.
Wenn Sie über genügend Speicherplatz verfügen, können Sie einen weiteren Index für die visitor
hinzufügen. Abhängig von der Anzahl der Aufrufe kann dies Ihre Abfragen in einigen Fällen beschleunigen.
Die Anzahl der Caching-Ansichten kann einen großen Einfluss auf die Leistung Ihrer Anwendung haben. Die Dokumentation zum Zwischenspeichern der Anzahl der Aufrufe können Sie hier lesen
Durch die Verwendung der Methode remember()
werden nur die Anzahl der Ansichten zwischengespeichert, die mit der Methode count()
erstellt wurden. Die Abfragebereiche orderByViews
und orderByUnique
verwenden diese Werte nicht, da sie nur etwas zum Abfrage-Generator hinzufügen. Um diese Abfragen zu optimieren, können Sie mit diesen Zählungen eine zusätzliche Spalte oder mehrere Spalten zu Ihrer sichtbaren Datenbanktabelle hinzufügen.
Beispiel: Wir möchten unsere Blog-Beiträge nach der Anzahl der einzelnen Aufrufe ordnen. Das erste, was Ihnen vielleicht in den Sinn kommt, ist die Verwendung des Abfragebereichs orderByUniqueViews
.
$ posts = Post:: latest ()-> orderByUniqueViews ()-> paginate ( 20 );
Diese Abfrage ist recht langsam, wenn viele Ansichten gespeichert sind. Um die Sache zu beschleunigen, können Sie Ihrer posts
beispielsweise eine Spalte unique_views_count
hinzufügen. Wir müssen diese Spalte regelmäßig mit der Anzahl der einzelnen Aufrufe aktualisieren. Dies kann leicht mit einem geplanten Laravel-Befehl erreicht werden.
Es gibt möglicherweise einen schnelleren Weg, dies zu tun, aber ein solcher Befehl kann wie folgt lauten:
$ posts = Post:: all ();
foreach ( $ posts as $ post ) {
$ post -> unique_views_count = views ( $ post )-> unique ()-> count ();
}
Wenn Sie eine der Kernklassen durch eigene Implementierungen erweitern oder ersetzen möchten, können Sie diese überschreiben:
CyrildeWitEloquentViewableViews
CyrildeWitEloquentViewableView
CyrildeWitEloquentViewableVisitor
CyrildeWitEloquentViewableCrawlerDetectAdapter
Hinweis: Vergessen Sie nicht, dass alle benutzerdefinierten Klassen ihre ursprünglichen Schnittstellen implementieren müssen
Die Visitor
-Klasse ist dafür verantwortlich, dem Views
Builder Informationen über den aktuellen Besucher bereitzustellen. Folgende Informationen werden bereitgestellt:
Die Standard- Visitor
erhält ihre Informationen aus der Anfrage. Daher können bei der Verwendung des Views
-Builders über eine RESTful-API einige Probleme auftreten. Um dieses Problem zu lösen, müssen Sie Ihre eigenen Daten über den Besucher angeben.
Sie können die Visitor
-Klasse global oder lokal überschreiben.
Visitor
Erstellen Sie Ihre eigene Visitor
Klasse in Ihrer Laravel-Anwendung und implementieren Sie die Schnittstelle CyrildeWitEloquentViewableContractsVisitor
. Erstellen Sie die erforderlichen Methoden über die Schnittstelle.
Alternativ können Sie die standardmäßige Visitor
erweitern, die in diesem Paket enthalten ist.
Binden Sie einfach Ihre benutzerdefinierte Visitor
an den CyrildeWitEloquentViewableContractsVisitor
Vertrag.
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Visitor::class,
App Services Views Visitor::class
);
Sie können die Besucherinstanz auch mithilfe der Setter-Methode useVisitor
im Views
-Builder festlegen.
use App Services Views Visitor ;
views ( $ post )
-> useVisitor ( new Visitor ()) // or app ( Visitor::class )
-> record ();
Views
Eloquent-Modell Binden Sie Ihre benutzerdefinierte Views
-Implementierung an CyrildeWitEloquentViewableContractsViews
.
Ändern Sie den folgenden Codeausschnitt und platzieren Sie ihn in der register
eines Dienstanbieters (z. B. AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Views::class,
App Services Views Views::class
);
View
Eloquent-Modell Binden Sie Ihre benutzerdefinierte View
Implementierung an CyrildeWitEloquentViewableContractsView
.
Ändern Sie den folgenden Codeausschnitt und platzieren Sie ihn in der register
eines Dienstanbieters (z. B. AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts View::class,
App Models View::class
);
Binden Sie Ihre benutzerdefinierte CrawlerDetector
Implementierung an CyrildeWitEloquentViewableContractsCrawlerDetector
.
Ändern Sie den folgenden Codeausschnitt und platzieren Sie ihn in der register
eines Dienstanbieters (z. B. AppServiceProvider
).
$ this -> app -> singleton (
CyrildeWit EloquentViewable Contracts CrawlerDetector::class,
App Services Views CustomCrawlerDetectorAdapter::class
);
Views
-Klasse use CyrildeWit EloquentViewable Views ;
Views:: macro ( ' countAndRemember ' , function () {
return $ this -> remember ()-> count ();
});
Jetzt können Sie diese Abkürzung wie folgt verwenden:
views ( $ post )-> countAndRemember ();
Views:: forViewable ( $ post )-> countAndRemember ();
Eine ausführliche Upgrade-Anleitung finden Sie unter UPGRADE.
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Weitere Informationen finden Sie unter BEITRAGEN.
Siehe auch die Liste der Mitwirkenden, die an diesem Projekt teilgenommen haben.
Hilfreiche Ressourcen:
Fügen Sie gerne weitere Alternativen hinzu!
Dieses Projekt ist unter der MIT-Lizenz lizenziert – Einzelheiten finden Sie in der LIZENZ-Datei.