davidjr82/eloquent-viewable

一个简单的包,允许您将视图与Eloquent模型关联

v2.4.1 2018-09-12 14:44 UTC

README

Packagist Travis branch StyleCI Codecov branch Total Downloads license

这个Laravel >= 5.5的包允许您将视图与Eloquent模型关联。

安装后,您可以执行以下操作

// Get the total number of views
$post->getViews();

// Get the total number of views since the given date
$post->getViews(Period::since(Carbon::parse('2014-02-23 00:00:00')));

// Get the total number of views between the given date range
$post->getViews(Period::create(Carbon::parse('2014-00-00 00:00:00'), Carbon::parse('2016-00-00 00:00:00')));

// Get the total number of views in the past 6 weeks (from today)
$post->getViews(Period::pastWeeks(6));

// Get the total number of views in the past 2 hours (from now)
$post->getViews(Period::subHours(2));

// Store a new view in the database
$post->addView();

概览

Eloquent Viewable是一个功能强大、灵活且易于使用的Laravel包,用于将视图与Eloquent模型关联。它旨在快速、灵活,适用于各种项目。

本包不是用于收集分析数据的。它旨在简单地存储Laravel Eloquent模型的视图。您可以使用此包用于如:文章、视频、课程和酒店等模型,当然,您也可以根据需要使用此包。

特性

以下是一些主要特性

  • 将视图与Eloquent模型关联
  • 获取(唯一)视图总数
  • 获取自特定日期以来的(唯一)视图总数
  • 获取截至特定日期的(唯一)视图总数
  • 获取两个日期之间的(唯一)视图总数
  • 获取从今天起过去的daysweeksmonthsyears的(唯一)视图总数
  • 获取从现在起过去的secondsminuteshoursdaysweeksmonthsyears的(唯一)视图总数
  • 缓存检索到的视图计数
  • 在将视图保存到数据库之前排队,以防止慢请求

欢迎提出功能请求!创建以[Feature Request]为前缀的问题或发送pull request。

文档

在本文档中,您可以找到一些有关使用此Laravel包的有用信息。如果您对此包有任何问题或发现任何安全相关的问题,请随时通过github@cyrildewit.nl与我联系。

目录

  1. 入门
  2. 使用
  3. 配置
  4. 食谱

入门

要求

Eloquent Viewable包需要PHP 7+Laravel 5.5+

Lumen不受支持!

版本信息

安装

您可以使用以下命令通过composer安装此包:

composer require cyrildewit/eloquent-viewable

可选,您可以在config/app.php文件中添加服务提供者。否则,这可以通过自动包发现来完成。

// config/app.php

'providers' => [
    // ...
    CyrildeWit\EloquentViewable\EloquentViewableServiceProvider::class,
];

您可以使用以下命令发布迁移文件:

php artisan vendor:publish --provider="CyrildeWit\EloquentViewable\EloquentViewableServiceProvider" --tag="migrations"

在发布迁移文件后,您可以运行迁移来创建views表。但是,如果您已经有一个名为views的表,您可以在配置中更改此名称。搜索'models->view->table_name'并将值更改为唯一的名称。

php artisan migrate

您可以使用以下命令发布配置文件:

php artisan vendor:publish --provider="CyrildeWit\EloquentViewable\EloquentViewableServiceProvider" --tag="config"

使用

在以下部分,您将找到有关使用此包的信息。

准备您的模型

要使Eloquent模型可查看,只需在模型定义中添加Viewable特质即可。此特质提供了各种方法,允许您保存视图、检索视图计数并按视图计数对项目进行排序。

use Illuminate\Database\Eloquent\Model;
use CyrildeWit\EloquentViewable\Viewable;

class Post extends Model
{
    use Viewable;

    // ...
}

存储视图

通过在可查看模型上调用 ->addView() 方法,轻松地向模型添加新视图。

最佳位置是在控制器中,如果你遵循 CRUD 标准,那么就是 @show 方法。

$post->addView();

一个 PostController 可能看起来像这样

// ...
public function show(Post $post)
{
    $post->addView();

    return view('blog.post', compact('post'));
}
// ...

注意:如果你想要排队执行这个任务,你可以在配置中开启它!请参阅排队执行 ProcessView 任务部分!

带有过期日期存储视图

如果你想在同一会话中的视图之间添加延迟,你可以使用可查看模型上的可用 addViewWithExpiryDate

$post->addViewWithExpiryDate(Carbon::now()->addHours(2));

此方法将向模型添加一个新视图,并在用户的会话中添加一条记录。如果你多次调用此方法,你会看到视图计数不会增加。当前日期时间超过过期日期后,将存储新的视图。

检索视图计数

在将 Viewable 特性添加到你的模型后,你将能够在可查看模型上调用 getViews()getUniqueViews()。这两个方法都接受一个可选的 Period 实例。

/**
 * Get the total number of views.
 *
 * @param  \CyrildeWit\EloquentViewable\Support\Period
 * @return int
 */
public function getViews($period = null): int;

/**
 * Get the total number of unique views.
 *
 * @param  \CyrildeWit\EloquentViewable\Support\Period
 * @return int
 */
public function getUniqueViews($period = null) : int;

Period 类

请注意,以下代码不是有效的 PHP 语法!

// Create a new Period instance.
Period::create(DateTime $startDateTime = null, DateTime $endDateTime = null);

// Create a new Period instance with only a start date time.
Period::since(DateTime $startDateTime);

// Create a new Period instance with only a end date time.
Period::upto(DateTime $endDateTime);
// Period instance with a start date time of today minus the given days.
Period::pastDays(int $days);

// Period instance with a start date time of today minus the given weeks.
Period::pastWeeks(int $weeks);

// Period instance with a start date time of today minus the given months.
Period::pastMonths(int $months);

// Period instance with a start date time of today minus the given years.
Period::pastYears(int $years);
// Period instance with a start date time of now minus the given seconds.
Period::subSeconds(int $seconds);

//Period instance with a start date time of now minus the given minutes.
Period::subMinutes(int $minutes);

// Period instance with a start date time of now minus the given hours.
Period::subHours(int $hours);

// Period instance with a start date time of now minus the given days.
Period::subDays(int $days);

// Period instance with a start date time of now minus the given weeks.
Period::subWeeks(int $weeks);

// Period instance with a start date time of now minus the given months.
Period::subMonths(int $months);

// Period instance with a start date time of now minus the given years.
Period::subYears(int $years);

示例

$post->getViews();

$post->getViews(Period::since(Carbon::parse('2007-05-21 12:23:00')));

$post->getViews(Period::upto(Carbon::parse('2013-05-21 00:00:00')));

$post->getViews(Period::create(Carbon::parse('2014-00-00 00:00:00'), Carbon::parse('2016-00-00 00:00:00')));
$post->getUniqueViews();

$post->getUniqueViews(Period::since(Carbon::parse('2007-05-21 12:23:00')));

$post->getUniqueViews(Period::upto(Carbon::parse('2013-05-21 00:00:00')));

$post->getUniqueViews(Period::create(Carbon::parse('2014-00-00 00:00:00'), Carbon::parse('2016-00-00 00:00:00')));
$post->getViews(Period::pastDays(5));

$post->getViews(Period::pastWeeks(6));

$post->getViews(Period::pastMonths(8));

$post->getViews(Period::pastYears(3));
$post->getUniqueViews(Period::pastDays(5));

$post->getUniqueViews(Period::pastWeeks(6));

$post->getUniqueViews(Period::pastMonths(8));

$post->getUniqueViews(Period::pastYears(3));
$post->getViews(Period::subSeconds(30));

$post->getViews(Period::subMinutes(15));

$post->getViews(Period::subHours(8));

$post->getViews(Period::subDays(5));

$post->getViews(Period::subWeeks(6));

$post->getViews(Period::subMonths(8));

$post->getViews(Period::subYears(3));
$post->getUniqueViews(Period::subSeconds(30));

$post->getUniqueViews(Period::subMinutes(15));

$post->getUniqueViews(Period::subHours(8));

$post->getUniqueViews(Period::subDays(5));

$post->getUniqueViews(Period::subWeeks(6));

$post->getUniqueViews(Period::subMonths(8));

$post->getUniqueViews(Period::subYears(3));

按视图计数排序模型

按视图数检索 Viewable 模型

$sortedPosts = Post::orderByViewsCount()->get(); // desc
$sortedPosts = Post::orderByViewsCount('asc')->get();

按唯一视图数检索 Viewable 模型

$sortedPosts = Post::orderByUniqueViewsCount()->get(); // desc
$sortedPosts = Post::orderByUniqueViewsCount('asc')->get();

ViewTracker辅助函数

按可查看类型获取视图

use CyrildeWit\EloquentViewable\ViewTracker;

// Get the total number of views of one type
ViewTracker::getViewsCountByType(Post::class);

// Get the total number of views of multiple types
ViewTracker::getViewsCountByTypes([Post::class, Location::class, Hotel::class]);

配置

排队ProcessView作业

当你对你的模型调用 ->addView() 方法时,它将在数据库中保存一个带有一些数据的新视图。因为这将减慢你的应用程序,你可以通过更改配置文件中 jobs 下的 store_new_view 的值来开启排队。确保你的应用程序已准备好排队。如果没有,请参阅官方的 Laravel 文档 获取更多信息!

扩展

如果你想用你自己的实现扩展或替换核心类,你可以覆盖它们

  • CyrildeWit\EloquentViewable\View
  • CyrildeWit\EloquentViewable\ViewableService
  • CyrildeWit\EloquentViewable\CrawlerDetector\CrawlerDetectAdapter

注意:不要忘记所有自定义类都必须实现它们原始的接口

替换 View 模型为自定义实现

$this->app->bind(
    \CyrildeWit\EloquentViewable\Contracts\View::class,
    \App\Models\CustomView::class
);

替换 ViewableService 服务为自定义实现

$this->app->singleton(
    \CyrildeWit\EloquentViewable\Contracts\ViewableService::class,
    \App\Services\CustomViewableService::class
);

替换 CrawlerDetectAdapter 类为自定义实现

$this->app->singleton(
    \CyrildeWit\EloquentViewable\Contracts\CrawlerDetector::class,
    \App\Services\CrawlerDetector\CustomAdapter::class
);

食谱

为常用周期格式创建辅助方法

App\Models\Post

// ...

public function getViewsSince(DateTime $sinceDateTime)
{
    return $this->getViews(Period::since($sinceDateTime));
}

public function getViewsUpto(DateTime $uptoDateTime)
{
    return $this->getViews(Period::upto($uptoDateTime));
}

public function getViewsBetween(DateTime $sinceDateTime, DateTime $uptoDateTime)
{
    return $this->getViews(Period::create($sinceDateTime, $uptoDateTime));
}

public function getViewsInPastDays(int $days)
{
    return $this->getViews(Period::pastDays($days));
}

// ...

resources/views/post/show.blade.php

<!-- ... -->

Page views since 2014: {{ $post->getViewsSince(Carbon::create(2014)) }}
Page views upto 2016: {{ $post->getViewsUpto(Carbon::create(2016)) }}
Page views between 2016 - 2018: {{ $post->getViewsBetween(Carbon::create(2016), Carbon::create(2018)) }}

Page views in the past 5 days: {{ $post->getViewsInPastDays(5) }}

<!-- ... -->

升级

请参阅UPGRADING 获取详细的升级指南。

变更日志

请参阅CHANGELOG 了解最近更改的详细信息。

贡献

请参阅CONTRIBUTING 获取详细信息。

鸣谢

许可

本项目受 MIT 许可证许可 - 请参阅LICENSE.md 文件获取详细信息。