这个 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 许可证获得许可 - 有关详细信息,请参阅许可证文件。