這個 Laravel >= 6.0 套件可讓您將視圖與 Eloquent 模型關聯起來。
安裝後你可以做這樣的事情:
// 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 ();有時您不想使用 Google Analytics 等第三方服務來追蹤應用程式的頁面視圖。那麼這個包就派上用場了。 Eloquent Viewable 可讓您輕鬆地將視圖與 Eloquent 模型關聯起來。它的設計考慮到了簡單性。
該套件將每個視圖記錄單獨儲存在資料庫中。這樣做的好處是它允許我們進行非常具體的計數。例如,如果我們想知道2018年1月10日到2月17日期間有多少人查看了特定帖子,我們可以執行以下操作: views($post)->period(Period::create('10-01-2018', '17-02-2018'))->count(); 。這樣做的缺點是,您的資料庫的大小可能會根據應用程式的訪客數量而快速增長。
以下是一些主要功能:
在本文檔中,您將找到一些有關使用此 Laravel 套件的有用資訊。
該軟體包需要PHP 7.4+和Laravel 6+ 。
不再維護對 Lumen 的支援。
| 版本 | 照亮 | 地位 | PHP版本 |
|---|---|---|---|
| ^7.0 | 6.xx - 11.xx | 捐款積極支持 | >= 7.4.0 |
首先,您需要透過 Composer 安裝軟體包:
composer require cyrildewit/eloquent-viewable其次,您可以透過以下方式發布遷移:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " migrations "最後,您需要執行migrate命令:
php artisan migrate您可以選擇使用以下方式發佈設定檔:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " config " 如果您喜歡手動註冊包,您可以將以下提供者新增至應用程式的提供者清單。
// config/app.php
' providers ' => [
// ...
CyrildeWit EloquentViewable EloquentViewableServiceProvider::class,
];要將視圖與模型關聯起來,模型必須實現以下介面和特徵:
CyrildeWitEloquentViewableContractsViewableCyrildeWitEloquentViewableInteractsWithViews例子:
use Illuminate Database Eloquent Model ;
use CyrildeWit EloquentViewable InteractsWithViews ;
use CyrildeWit EloquentViewable Contracts Viewable ;
class Post extends Model implements Viewable
{
use InteractsWithViews;
// ...
}若要進行視圖記錄,您可以呼叫 Fluent Views實例上的record方法。
views ( $ post )-> record ();記錄訪客視圖的最佳位置是控制器內部。例如:
// PostController . php
public function show ( Post $ post )
{
views ( $ post )-> record ();
return view ( ' post.show ' , compact ( ' post ' ));
}注意:此包預設過濾掉爬蟲。測試時請注意這一點,因為 Postman 也是一個爬蟲。
您可以在Views實例上使用cooldown方法在視圖記錄之間新增冷卻時間。設定冷卻時間時,需要指定分鐘數。
views ( $ post )
-> cooldown ( $ minutes )
-> record ();您也可以傳遞DateTimeInterface實例,而不是將分鐘數作為整數傳遞。
$ expiresAt = now ()-> addHours ( 3 );
views ( $ post )
-> cooldown ( $ expiresAt )
-> record ();當記錄具有會話延遲的視圖時,此套件還會在訪客會話中保存視圖的快照以及到期日期時間。每當訪客再次查看該項目時,該套件都會檢查他的會話並決定是否應將該視圖保存在資料庫中。
views ( $ post )-> count (); use CyrildeWit EloquentViewable Support Period ;
// Example : get views count from 2017 upto 2018
views ( $ post )
-> period (Period:: create ( ' 2017 ' , ' 2018 ' ))
-> count ();這個包附帶的Period類別提供了許多方便的功能。 Period類別的 API 如下所示:
$ 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 ));使用Carbon::today()作為開始日期時間減去給定單位。
Period:: pastDays (int $ days );
Period:: pastWeeks (int $ weeks );
Period:: pastMonths (int $ months );
Period:: pastYears (int $ years );使用Carbon::now()作為開始日期時間減去給定單位。
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 );如果您只想檢索唯一觀看次數,只需將unique方法新增至鏈中即可。
views ( $ post )
-> unique ()
-> count ();Viewable特徵為您的模型添加了兩個範圍: orderByViews和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當然,也可以使用獨特的視圖變體:
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如果你想知道特定的可查看類型有多少個視圖,你需要將一個空的 Eloquent 模型傳遞給views()幫助器,如下所示:
views ( new Post ())-> count ();您也可以傳遞完全限定的類別名稱。然後,該套件將從應用程式容器中解析一個實例。
views (Post::class)-> count ();
views ( ' AppPost ' )-> count ();如果相同視覺類型有不同類型的視圖,您可能想要將它們儲存在自己的集合中。
views ( $ post )
-> collection ( ' customCollection ' )
-> record ();若要擷取特定集合中的視圖計數,您可以重複使用相同的collection()方法。
views ( $ post )
-> collection ( ' customCollection ' )
-> count ();若要在刪除時自動刪除可查看的 Eloquent 模型的所有視圖,您可以透過在模型定義中將removeViewsOnDelete屬性設為true來啟用它。
protected $ removeViewsOnDelete = true ;在某些情況下,快取視圖計數可能具有挑戰性。例如,該週期可以是動態的,這使得快取不可能。這就是為什麼您可以利用內建的快取功能。
要快取視圖計數,只需將remember()方法加入鏈中即可。預設生命週期是永遠。
範例:
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 ();預設views表遷移檔案已經有兩個索引viewable_id和viewable_type 。
如果您有足夠的可用儲存空間,您可以為visitor欄位新增另一個索引。根據瀏覽量,在某些情況下這可能會加快您的查詢速度。
快取視圖計數會對應用程式的效能產生很大影響。您可以在此處閱讀有關快取視圖計數的文檔
使用remember()方法只會快取count()方法所建立的視圖計數。 orderByViews和orderByUnique查詢範圍不使用這些值,因為它們僅在查詢產生器中新增一些內容。若要最佳化這些查詢,您可以使用這些計數將額外的列或多列新增至可檢視的資料庫表中。
範例:我們想按獨特瀏覽次數對部落格文章進行排序。您可能想到的第一件事是使用orderByUniqueViews查詢範圍。
$ posts = Post:: latest ()-> orderByUniqueViews ()-> paginate ( 20 );當您儲存大量視圖時,此查詢非常緩慢。為了加快速度,您可以將unique_views_count列新增到您的posts表中。我們必須定期更新此列的唯一觀看次數。這可以使用預定的 Laravel 命令輕鬆實現。
可能有一種更快的方法來做到這一點,但這樣的命令可以是這樣的:
$ posts = Post:: all ();
foreach ( $ posts as $ post ) {
$ post -> unique_views_count = views ( $ post )-> unique ()-> count ();
}如果您想用自己的實作擴展或替換核心類別之一,您可以覆蓋它們:
CyrildeWitEloquentViewableViewsCyrildeWitEloquentViewableViewCyrildeWitEloquentViewableVisitorCyrildeWitEloquentViewableCrawlerDetectAdapter注意:不要忘記所有自訂類別都必須實現其原始接口
Visitor類別負責向Views建構器提供目前訪客的資訊。提供以下資訊:
預設的Visitor類別從請求中取得其資訊。因此,透過 RESTful API 使用Views建構器時可能會遇到一些問題。為了解決這個問題,您需要提供您自己的有關訪客的資料。
您可以全域或本機覆蓋Visitor類別。
Visitor類在 Laravel 應用程式中建立您自己的Visitor類別並實作CyrildeWitEloquentViewableContractsVisitor介面。透過介面創建所需的方法。
或者,您可以擴充此套件隨附的預設Visitor類別。
只需將您的自訂Visitor實作綁定到CyrildeWitEloquentViewableContractsVisitor合約即可。
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Visitor::class,
App Services Views Visitor::class
);您也可以使用Views建構器上的useVisitor setter 方法來設定訪客實例。
use App Services Views Visitor ;
views ( $ post )
-> useVisitor ( new Visitor ()) // or app ( Visitor::class )
-> record ();Views Eloquent 模型將您的自訂Views實作綁定到CyrildeWitEloquentViewableContractsViews 。
更改以下程式碼片段並將其放置在服務提供者(例如AppServiceProvider )的register方法中。
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Views::class,
App Services Views Views::class
);View Eloquent 模型將您的自訂View實作綁定到CyrildeWitEloquentViewableContractsView 。
更改以下程式碼片段並將其放置在服務提供者(例如AppServiceProvider )的register方法中。
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts View::class,
App Models View::class
);將您的自訂CrawlerDetector實作綁定到CyrildeWitEloquentViewableContractsCrawlerDetector 。
更改以下程式碼片段並將其放置在服務提供者(例如AppServiceProvider )的register方法中。
$ 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 ();
});現在您可以像這樣使用這個簡寫:
views ( $ post )-> countAndRemember ();
Views:: forViewable ( $ post )-> countAndRemember ();詳細升級指南請參閱升級。
請參閱變更日誌以了解有關最近更改內容的更多資訊。
詳細資訊請參閱貢獻。
另請參閱參與專案的貢獻者清單。
有用的資源:
請隨意添加更多替代方案!
該項目根據 MIT 許可證獲得許可 - 有關詳細信息,請參閱許可證文件。