我想知道你是如何在Laravel 5中制作一个页面查看计数器的。是否有任何特定的包可以帮助我解决这个问题?我基本上卡住了,因为最近发布了Laravel 5的稳定版本。
答案 0 :(得分:6)
有很多方法可以实现这一目标,但每种方式都有其优点和缺点。在这个答案中,我将向您展示构建综合浏览器计数器的一些不同方法。
假设我们正在构建一个包含帖子的博客,我们希望跟踪总浏览次数。我们可以做的是将列views
或page_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”的总观看次数。
这种方式与方式#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
添加到app / 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);
}