這個 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,
];
要將視圖與模型關聯起來,模型必須實現以下介面和特徵:
CyrildeWitEloquentViewableContractsViewable
CyrildeWitEloquentViewableInteractsWithViews
例子:
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 ();
}
如果您想用自己的實作擴展或替換核心類別之一,您可以覆蓋它們:
CyrildeWitEloquentViewableViews
CyrildeWitEloquentViewableView
CyrildeWitEloquentViewableVisitor
CyrildeWitEloquentViewableCrawlerDetectAdapter
注意:不要忘記所有自訂類別都必須實現其原始接口
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 許可證獲得許可 - 有關詳細信息,請參閱許可證文件。