如何使用 Laravel 和 Google Analytics 创建热门列表

发布于 作者

How to Create A Most Popular List with Laravel and Google Analytics image

在 Laravel 新闻网站上,我想要生成过去七天中最热门文章的列表,并将结果从最热门到最不热门排序显示。

为了解决这个问题,我想到了两种方案。第一种是自己构建跟踪系统,以便我可以记录访问次数,然后用它进行排序。但是,这可能会产生大量数据,并且看起来像是一个分析跟踪服务可以处理的解决方案。

当我浏览 Google Analytics API 时,我发现 Spatie.be 开发了一个名为 Laravel Analytics 的包,它可以让你轻松地从你的 Google Analytics 帐户中获取数据,并且看起来是解决这个问题的最佳方法。让我们看看我是如何使用它来生成 Laravel 新闻网站上热门文章的列表的。

安装和设置

安装过程与任何 Laravel 包类似,首先通过 Composer 安装包

composer require spatie/laravel-analytics

接下来,将服务提供商添加到 config/app.php

'providers' => [
Spatie\Analytics\AnalyticsServiceProvider::class,
];

最后,将 Facade 添加到相同的 config/app.php

'aliases' => [
'Analytics' => Spatie\Analytics\AnalyticsFacade::class,
];

完成这些设置后,最困难的部分开始了,但这并非包本身的错误。只是 Google 的凭据生成系统非常复杂。最好访问 自述文件中的这一部分,它将带你逐步完成设置过程,并配有截图。

获取最热门的文章

Analytics 包使获取数据变得非常简单,以下是一个示例,展示了如何获取过去七天中最热门页面,并设置限制

$pages = Analytics::fetchMostVisitedPages(Period::days(7), $limit);

然后它返回一个 Laravel 集合,其中包含类似于以下内容的结果

Collection {#400 ▼
#items: array:17 [▼
0 => array:3 [▼
"url" => "/"
"pageTitle" => "Laravel News"
"pageViews" => 10
]
1 => array:3 [▼
"url" => "/"
"pageTitle" => "Laravel News - News and information about Laravel"
"pageViews" => 9
]
2 => array:3 [▼
"url" => "/2016/06/look-whats-coming-laravel-5-3/"
"pageTitle" => "A look at what’s coming to Laravel 5.3"
"pageViews" => 8
]
3 => array:3 [▼
"url" => "/2016/06/look-whats-coming-laravel-5-3/"
"pageTitle" => "A look at what's coming to Laravel 5.3 - Laravel News"
"pageViews" => 7
]
4 => array:3 [▼
"url" => "/2016/08/laravel-5-3-rc1-is-now-released/"
"pageTitle" => "Laravel 5.3 RC1 is now released"
"pageViews" => 6
]
]
}

如果你注意到,前两个结果是首页,而接下来的两个结果是同一篇文章,它们显示两次的原因是标题不同。一组是在我更改网站标题之前,另一组是在之后。

另一个问题是,我不希望首页出现在列表中。我更希望只显示文章。

让我们在完成集成过程中清理这些结果。

构建包装类

现在我已获取到结果,并且知道需要对其进行解析,所以我决定创建一个类来处理获取和处理过程。

我创建了一个名为 app/Services/Trending.php 的新文件,并用基本的获取代码对其进行了填充

<?php
 
namespace App\Services;
 
use Analytics;
use Spatie\Analytics\Period;
 
class Trending
{
public function week($limit = 15)
{
return $this->getResults(7);
}
 
protected function getResults($days, $limit=15)
{
return Analytics::fetchMostVisitedPages(Period::days($days), $limit);
}
}

现在调用该类应该会得到与之前相同的结果,以下是一个示例调用

$trending = app('App\Services\Trending')->week();

接下来,它需要另一个方法来解析结果。如前所述,它需要移除任何重复项,移除任何不是实际文章的页面,以及移除 Google 报告的标题中的 “ – Laravel 新闻” 后缀。

由于 fetchMostVisitedPages 返回的结果是一个集合,因此我们可以轻松地使用其所有方法,以下展示了该方法的完成代码

protected function parseResults($data)
{
return $data->reject(function($item){
return $item['url'] == '/' or
$item['url'] == '/blog' or
starts_with($item['url'], '/category');
})->unique('url')->transform(function($item){
$item['pageTitle'] = str_replace(' - Laravel News', '', $item['pageTitle']);
return $item;
});
}

如果我们逐步执行此方法,它首先会 **拒绝** 任何 url 为 “/”,或 “/blog”,或 url **以** “/category” 开头的项。这些是我三个主要的栏目,它们会生成足够的流量,并可能出现在列表中。

接下来,它调用 ->unique('url') 来防止任何重复的 url 传递。

最后,它调用 ->transform() 来移除 “ – Laravel 新闻” 后缀。

接下来,修改 getResults 以使用解析器

protected function getResults($days, $limit=15)
{
$data = Analytics::fetchMostVisitedPages(Period::days($days), $limit);
return $this->parseResults($data);
}

现在,如果我们再次运行它,所有返回的数据都应该是正确的

Collection {#396 ▼
#items: array:11 [▼
2 => array:3 [▼
"url" => "/2016/06/look-whats-coming-laravel-5-3/"
"pageTitle" => "A look at what’s coming to Laravel 5.3"
"pageViews" => 10
]
4 => array:3 [▼
"url" => "/2016/08/laravel-5-3-rc1-is-now-released/"
"pageTitle" => "Laravel 5.3 RC1 is now released"
"pageViews" => 9
]
5 => array:3 [▼
"url" => "/2016/07/laravel-5-3-recap/"
"pageTitle" => "Laracon: Laravel 5.3 Recap"
"pageViews" => 8
]
6 => array:3 [▶]
7 => array:3 [▶]
8 => array:3 [▶]
9 => array:3 [▶]
12 => array:3 [▶]
13 => array:3 [▶]
14 => array:3 [▶]
15 => array:3 [▶]
]
}

它似乎正常工作,但请注意,我们想要 15 个项目,但结果只有 11 个。这是因为我们最初获取了 15 个热门项目,然后拒绝了任何重复项。这导致我们获得的项目少于我们想要的 15 个。

我想到的解决方案是请求比我们需要更多的数据,然后 **截取** 我们真正需要的数量。首先,将 getResults 修改为获取比需要更多的数据

protected function getResults($days, $limit=15)
{
$data = Analytics::fetchMostVisitedPages(Period::days($days), $limit + 10);
return $this->parseResults($data, $limit);
}

请注意,它不再将限制传递给 fetchMostVisitedPages,而是添加了 10 个。这样,我们就有了额外项目的缓冲区。

接下来,修改 parseResults 在所有解析操作完成后 **截取** 限制

protected function parseResults($data, $limit)
{
return $data->reject(function($item){
return $item['url'] == '/' or
$item['url'] == '/blog' or
starts_with($item['url'], '/category');
})->unique('url')->transform(function($item){
$item['pageTitle'] = str_replace(' - Laravel News', '', $item['pageTitle']);
return $item;
})->splice(0, $limit);
}

现在,它会返回正确的结果

Collection {#353 ▼
#items: array:15 [▶]
}

所有这些都正常工作后,是时候将它实现到视图中,我相信这将是视图组合器的一个很好的用例。

创建视图组合器

如果你不熟悉视图组合器,以下是如何根据文档描述它们

视图组合器是回调函数或类方法,它们在渲染视图时被调用。如果你想将某些数据绑定到每个渲染的视图,视图组合器可以帮助你将这些逻辑组织到一个单独的位置。

由于这些数据只会在侧边栏中显示,并且可以从任何控制器调用,因此它非常适合作为视图组合器。

要设置这个视图组合器,创建 app/Http/ViewComposers/PopularityComposer.php 并添加以下类

<?php
 
namespace App\Http\ViewComposers;
 
use App\Services\Trending;
use Illuminate\View\View;
 
class PopularityComposer
{
private $trending;
 
public function __construct(Trending $trending)
{
$this->trending = $trending;
}
 
public function compose(View $view)
{
$view->with('popular', $this->trending->week());
}
}

这将我们的之前定义的 Trending 类设置为依赖项,然后在 compose 方法中添加一个名为 “popular” 的视图变量,它将保存我们的结果集合。

接下来,打开 app/Providers/ComposerServiceProvider.php 并注册我们新创建的组合器

view()->composer(
'sidebar', PopularityComposer::class
);

这将注册我们刚刚创建的 PopularityComposer 类到侧边栏视图。

将列表添加到视图

最后一步是将实际的列表添加到侧边栏。创建 resources/views/sidebar.blade.php 并添加一个简单的列表,如下所示

<ol>
@foreach ($popular as $post)
<li><a href="{{ $post['url'] }}">{{ $post['pageTitle'] }}</a></li>
@endforeach
</ol>

就这样。你现在应该在侧边栏中看到一个漂亮的最热门文章列表。

总结

如你所见,通过使用社区包、Laravel 集合和视图组合器,我能够快速轻松地设置一个最热门文章列表。

Eric L. Barnes photo

Eric 是 Laravel 新闻网站的创建者,从 2012 年开始报道 Laravel。

归档于
Cube

Laravel 新闻稿

加入 40,000 多名其他开发者,绝不错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动补全和对本地和生产环境的即时反馈进行微调。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自 No Compromises 播客的两名经验丰富的开发人员,现在可以为您的 Laravel 项目雇用。 ⬧ 固定价格 $7500/月。 ⬧ 没有冗长的销售流程。 ⬧ 没有合同。 ⬧ 100%退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?立即进行自动化 Laravel 升级和代码现代化,以保持应用程序的新鲜感。

Shift
Bacancy logo

Bacancy

只需 $2500/月,即可让经验丰富的 Laravel 开发人员(拥有 4-6 年经验)为您的项目提供强大支持。获得 160 小时的专业知识和 15 天的无风险试用期。立即安排电话会议!

Bacancy
Lucky Media logo

Lucky Media

立即获取 Lucky - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源包,将现代无头电子商务功能的力量带到 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 职位招聘网站

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。支付、精美结帐、管理面板、用户仪表板、身份验证、现成组件、统计信息、博客、文档等等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝升级 Laravel、降低成本并加速创新的合作伙伴,助力企业取得成功

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务性、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 的灵活、现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的无依赖性输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速模糊站点搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包为您的 Laravel 应用程序添加评论

阅读文章