Laravel 5中的页面视图计数器

时间:2015-02-22 09:42:25

标签: laravel

我想知道你是如何在Laravel 5中制作一个页面查看计数器的。是否有任何特定的包可以帮助我解决这个问题?我基本上卡住了,因为最近发布了Laravel 5的稳定版本。

4 个答案:

答案 0 :(得分:6)

有很多方法可以实现这一目标,但每种方式都有其优点和缺点。在这个答案中,我将向您展示构建综合浏览器计数器的一些不同方法。

#1数据库表中的简单列

假设我们正在构建一个包含帖子的博客,我们希望跟踪总浏览次数。我们可以做的是将列viewspage_views添加到我们的posts数据库表中。此列将存储页面查看的总数。每次向某人展示帖子时,我们都可以增加此号码。

示例代码:

public function show($id)
{
    $post = \App\Models\Post::find($id); // fetch post from database
    $post->increment('views'); // add a new page view to our `views` column by incrementing it

    return view('posts.show', [
        'post' => $post,
    ]);
}

然后在你的视图(刀片或php)中,你可以得到这样的列;

<div class="panel-footer">
    Views: {{ $post->views }}
</div>

但是通过这种方式,我们永远不会知道人们何时正好看过帖子。它只能获得总数,而不是过去24小时,7天,14周或“12-01-2017”的总观看次数。

#2用于存储所有视图的额外表

这种方式与方式#1非常不同,因为每个页面视图都将作为记录存储在表格中。

在编写步骤之前,我想告诉您我创建了一个名为Eloquent Viewable的包。它的工作方式与#2完全相同。

首先,您需要为views表创建数据库迁移。此迁移应包含以下内容:

$table->increments('id')->unsigned();
$table->morphs('viewable');
$table->timestamps();

然后我们需要创建一个Eloquent模型,以便我们可以获取视图:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class View extends Model
{
    protected $table = 'views';
    protected $guarded = ['id'];
}

然后添加到可查看的每个模型或需要此功能的以下代码。在此示例中,我们将此功能提供给Post模型。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;

class Post extends Model
{
    /**
     * Get the page views associated with the given model.
     *
     * @return \Illuminate\Database\Eloquent\Relations\MorphMany
     */
    public function views()
    {
        return $this->morphMany(
            \App\Models\View::class,
            'viewable'
        );
    }

    /**
     * Get the total number of views.
     *
     * @return int
     */
    public function getViewsCount()
    {
        return $this->views()->count();
    }

    public function getViewsCountSince($sinceDateTime)
    {
        return $this->views()->where('created_at', '>', $sinceDateTime)->count();
    }

    public function getViewsCountUpto($uptoDateTime)
    {
        return $this->views()->where('created_at', <', $uptoDateTime)->count();
    }
}

现在,您可以使用以下方法来获取视图计数。

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

// total number of views since the past 24 hours
$post->getViewsCountSince(Carbon::now()->subDay(1));

// total number of views upto 2 months ago
$post->getViewsCountUpto(Carbon::now()->subMonths(2));

答案 1 :(得分:1)

这个包很棒,易于使用,我得到了同样的问题,但我发现这个包解决了 Kryptonit3/Counter

答案 2 :(得分:0)

如果您想构建自己的自我,那将非常容易。

app/Htpp/Middleware/PageViews.php中创建一个新的中间件:

<?php

namespace App\Http\Middleware;

use Closure;

class PageViews
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        PageView::increment();

        return $next($request);
    }

}

现在将\App\Http\Middleware\PageViews::class添加到a​​pp / Http / Kernel.php类的$ middleware属性中。

显然我放入了PageView :: increment()这不起作用,因为没有实现PageView。最简单的实现方法可能是为页面视图创建一个带有int的表,并创建一个PageView模型。

更高级的解决方案是将其存储在缓存中,并使用cron作业每小时将其保存到永久存储器中。只是为了限制保存页面浏览量的性能。

答案 3 :(得分:-1)

您可以使用此软件包,使用非常简单

https://github.com/cyrildewit/eloquent-viewable#recording-views

安装和配置后您可以做的几件事:

function func1() {
        return setInterval(() => fetch(url, { method: 'GET' }), 5000);
}

function func2() {
        return setInterval(() => fetch(url, { method: 'GET' }), 30000);
}