Paket Laravel >= 6.0 ini memungkinkan Anda mengaitkan tampilan dengan model Eloquent.
Setelah terinstal, Anda dapat melakukan hal-hal seperti ini:
// 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 ();
Terkadang Anda tidak ingin menggunakan layanan pihak ketiga seperti Google Analytics untuk melacak tampilan halaman aplikasi Anda. Maka paket ini akan berguna. Eloquent Viewable memungkinkan Anda dengan mudah mengaitkan tampilan dengan model Eloquent. Ini dirancang dengan mempertimbangkan kesederhanaan.
Paket ini menyimpan setiap rekaman tampilan satu per satu di database. Keuntungannya adalah memungkinkan kita menghitung secara spesifik. Misalnya, jika kita ingin mengetahui berapa banyak orang yang telah melihat postingan tertentu antara 10 Januari dan 17 Februari 2018, kita dapat melakukan hal berikut: views($post)->period(Period::create('10-01-2018', '17-02-2018'))->count();
. Kerugiannya adalah ukuran database Anda dapat berkembang pesat tergantung pada jumlah pengunjung yang dimiliki aplikasi Anda.
Berikut beberapa fitur utamanya:
Dalam dokumentasi ini, Anda akan menemukan beberapa informasi bermanfaat tentang penggunaan paket Laravel ini.
Paket ini membutuhkan PHP 7.4+ dan Laravel 6+ .
Dukungan untuk Lumen tidak dipertahankan.
Versi | Menerangi | Status | Versi PHP |
---|---|---|---|
^7.0 | 6.xx - 11.xx | Dukungan aktif melalui kontribusi | >= 7.4.0 |
Pertama, Anda perlu menginstal paket melalui Composer:
composer require cyrildewit/eloquent-viewable
Kedua, Anda dapat mempublikasikan migrasi dengan:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " migrations "
Terakhir, Anda perlu menjalankan perintah migrate
:
php artisan migrate
Anda secara opsional dapat mempublikasikan file konfigurasi dengan:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " config "
Jika Anda lebih memilih untuk mendaftarkan paket secara manual, Anda dapat menambahkan penyedia berikut ke daftar penyedia aplikasi Anda.
// config/app.php
' providers ' => [
// ...
CyrildeWit EloquentViewable EloquentViewableServiceProvider::class,
];
Untuk mengaitkan tampilan dengan model, model harus mengimplementasikan antarmuka dan sifat berikut:
CyrildeWitEloquentViewableContractsViewable
CyrildeWitEloquentViewableInteractsWithViews
Contoh:
use Illuminate Database Eloquent Model ;
use CyrildeWit EloquentViewable InteractsWithViews ;
use CyrildeWit EloquentViewable Contracts Viewable ;
class Post extends Model implements Viewable
{
use InteractsWithViews;
// ...
}
Untuk membuat rekaman tampilan, Anda dapat memanggil metode record
pada instance Fluent Views
.
views ( $ post )-> record ();
Tempat terbaik di mana Anda harus merekam pandangan pengunjung adalah di dalam pengontrol Anda. Misalnya:
// PostController . php
public function show ( Post $ post )
{
views ( $ post )-> record ();
return view ( ' post.show ' , compact ( ' post ' ));
}
Catatan: Paket ini memfilter crawler secara default. Waspadai hal ini saat melakukan pengujian, karena Tukang Pos misalnya juga merupakan crawler.
Anda dapat menggunakan metode cooldown
pada instance Views
untuk menambahkan cooldown di antara rekaman tampilan. Saat Anda menyetel cooldown, Anda perlu menentukan jumlah menitnya.
views ( $ post )
-> cooldown ( $ minutes )
-> record ();
Daripada meneruskan jumlah menit sebagai bilangan bulat, Anda juga dapat meneruskan instance DateTimeInterface
.
$ expiresAt = now ()-> addHours ( 3 );
views ( $ post )
-> cooldown ( $ expiresAt )
-> record ();
Saat merekam tampilan dengan penundaan sesi, paket ini juga akan menyimpan cuplikan tampilan di sesi pengunjung dengan tanggal kedaluwarsa. Setiap kali pengunjung melihat item itu lagi, paket ini akan memeriksa sesinya dan memutuskan apakah tampilan tersebut harus disimpan dalam database atau tidak.
views ( $ post )-> count ();
use CyrildeWit EloquentViewable Support Period ;
// Example : get views count from 2017 upto 2018
views ( $ post )
-> period (Period:: create ( ' 2017 ' , ' 2018 ' ))
-> count ();
Kelas Period
yang disertakan dengan paket ini menyediakan banyak fitur berguna. API kelas Period
terlihat sebagai berikut:
$ 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 ));
Menggunakan Carbon::today()
sebagai tanggal waktu mulai dikurangi unit tertentu.
Period:: pastDays (int $ days );
Period:: pastWeeks (int $ weeks );
Period:: pastMonths (int $ months );
Period:: pastYears (int $ years );
Menggunakan Carbon::now()
sebagai tanggal waktu mulai dikurangi unit tertentu.
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 );
Jika Anda hanya ingin mengambil jumlah penayangan unik, Anda cukup menambahkan metode unique
ke rantai.
views ( $ post )
-> unique ()
-> count ();
Sifat Viewable
menambahkan dua cakupan ke model Anda: orderByViews
dan 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
Dan tentu saja, hal ini juga dimungkinkan dengan varian tampilan unik:
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
Jika Anda ingin mengetahui berapa banyak tampilan yang dimiliki tipe tampilan tertentu, Anda perlu meneruskan model Eloquent kosong ke helper views()
seperti:
views ( new Post ())-> count ();
Anda juga dapat memberikan nama kelas yang sepenuhnya memenuhi syarat. Paket tersebut kemudian akan menyelesaikan sebuah instance dari kontainer aplikasi.
views (Post::class)-> count ();
views ( ' AppPost ' )-> count ();
Jika Anda memiliki tipe tampilan berbeda untuk tipe tampilan yang sama, Anda mungkin ingin menyimpannya dalam koleksinya sendiri.
views ( $ post )
-> collection ( ' customCollection ' )
-> record ();
Untuk mengambil jumlah penayangan dalam koleksi tertentu, Anda dapat menggunakan kembali metode collection()
yang sama.
views ( $ post )
-> collection ( ' customCollection ' )
-> count ();
Untuk secara otomatis menghapus semua tampilan model Eloquent yang terlihat saat dihapus, Anda dapat mengaktifkannya dengan mengatur properti removeViewsOnDelete
ke true
dalam definisi model Anda.
protected $ removeViewsOnDelete = true ;
Menyimpan jumlah penayangan dalam cache dapat menjadi tantangan dalam beberapa skenario. Misalnya, periodenya bisa dinamis yang membuat caching tidak mungkin dilakukan. Itu sebabnya Anda dapat menggunakan fungsi caching bawaan.
Untuk menyimpan jumlah penayangan dalam cache, cukup tambahkan metode remember()
ke rantai. Masa pakai default adalah selamanya.
Contoh:
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 ();
File migrasi tabel views
default sudah memiliki dua indeks untuk viewable_id
dan viewable_type
.
Jika Anda memiliki cukup penyimpanan, Anda dapat menambahkan indeks lain untuk kolom visitor
. Bergantung pada jumlah penayangan, hal ini mungkin mempercepat kueri Anda dalam beberapa kasus.
Jumlah penayangan dalam cache dapat berdampak besar pada kinerja aplikasi Anda. Anda dapat membaca dokumentasi tentang caching jumlah penayangan di sini
Menggunakan metode remember()
hanya akan menyimpan jumlah tampilan yang dibuat oleh metode count()
dalam cache. Cakupan kueri orderByViews
dan orderByUnique
tidak menggunakan nilai ini karena hanya menambahkan sesuatu ke pembuat kueri. Untuk mengoptimalkan kueri ini, Anda bisa menambahkan kolom tambahan atau beberapa kolom ke tabel database yang dapat dilihat dengan jumlah ini.
Contoh: kita ingin mengurutkan postingan blog kita berdasarkan jumlah penayangan unik . Hal pertama yang mungkin terlintas dalam pikiran Anda adalah menggunakan cakupan kueri orderByUniqueViews
.
$ posts = Post:: latest ()-> orderByUniqueViews ()-> paginate ( 20 );
Kueri ini cukup lambat ketika Anda menyimpan banyak tampilan. Untuk mempercepat, Anda dapat menambahkan misalnya kolom unique_views_count
ke tabel posts
Anda. Kami harus memperbarui kolom ini secara berkala dengan jumlah penayangan unik. Ini dapat dengan mudah dicapai dengan menggunakan perintah Laravel terjadwal.
Mungkin ada cara yang lebih cepat untuk melakukan ini, tetapi perintahnya bisa seperti:
$ posts = Post:: all ();
foreach ( $ posts as $ post ) {
$ post -> unique_views_count = views ( $ post )-> unique ()-> count ();
}
Jika Anda ingin memperluas atau mengganti salah satu kelas inti dengan implementasi Anda sendiri, Anda dapat menggantinya:
CyrildeWitEloquentViewableViews
CyrildeWitEloquentViewableView
CyrildeWitEloquentViewableVisitor
CyrildeWitEloquentViewableCrawlerDetectAdapter
Catatan: Jangan lupa bahwa semua kelas khusus harus mengimplementasikan antarmuka aslinya
Kelas Visitor
bertanggung jawab untuk menyediakan informasi pembuat Views
tentang pengunjung saat ini. Informasi berikut disediakan:
Kelas Visitor
default mendapatkan informasinya dari permintaan. Oleh karena itu, Anda mungkin mengalami beberapa masalah saat menggunakan pembuat Views
melalui RESTful API. Untuk mengatasi ini, Anda perlu memberikan data Anda sendiri tentang pengunjung.
Anda dapat mengganti kelas Visitor
secara global atau lokal.
Visitor
Anda sendiri Buat kelas Visitor
Anda sendiri di aplikasi Laravel Anda dan implementasikan antarmuka CyrildeWitEloquentViewableContractsVisitor
. Buat metode yang diperlukan oleh antarmuka.
Alternatifnya, Anda dapat memperluas kelas Visitor
default yang disertakan dengan paket ini.
Cukup ikat penerapan Visitor
kustom Anda ke kontrak CyrildeWitEloquentViewableContractsVisitor
.
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Visitor::class,
App Services Views Visitor::class
);
Anda juga dapat menyetel instance pengunjung menggunakan metode penyetel useVisitor
di pembuat Views
.
use App Services Views Visitor ;
views ( $ post )
-> useVisitor ( new Visitor ()) // or app ( Visitor::class )
-> record ();
Views
Eloquent Anda sendiri Ikat implementasi Views
kustom Anda ke CyrildeWitEloquentViewableContractsViews
.
Ubah cuplikan kode berikut dan letakkan di metode register
di penyedia layanan (misalnya AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Views::class,
App Services Views Views::class
);
View
Eloquent Anda sendiri Ikat implementasi View
kustom Anda ke CyrildeWitEloquentViewableContractsView
.
Ubah cuplikan kode berikut dan letakkan di metode register
di penyedia layanan (misalnya AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts View::class,
App Models View::class
);
Ikat penerapan CrawlerDetector
khusus Anda ke CyrildeWitEloquentViewableContractsCrawlerDetector
.
Ubah cuplikan kode berikut dan letakkan di metode register
di penyedia layanan (misalnya 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 ();
});
Sekarang Anda dapat menggunakan singkatan ini seperti ini:
views ( $ post )-> countAndRemember ();
Views:: forViewable ( $ post )-> countAndRemember ();
Silakan lihat PENINGKATAN untuk panduan peningkatan terperinci.
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
Silakan lihat KONTRIBUSI untuk rinciannya.
Lihat juga daftar kontributor yang berpartisipasi dalam proyek ini.
Sumber Daya Bermanfaat:
Jangan ragu untuk menambahkan lebih banyak alternatif!
Proyek ini dilisensikan di bawah Lisensi MIT - lihat file LISENSI untuk detailnya.