get-stream / stream-laravel
使用 getstream.io 在 Laravel 上构建新闻源和活动源
Requires
- php: >=8.0
- get-stream/stream: ^7.0.1
- illuminate/database: >=9.0
- illuminate/support: >=9.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14.0
- mockery/mockery: ^1.5
- phpunit/phpunit: ^9.6.3
This package is auto-updated.
Last update: 2024-08-25 16:49:04 UTC
README
stream-laravel 是一个用于 Stream 的 Laravel 客户端。您可以在任何 Laravel 应用程序中,或者在任何使用 Eloquent ORM (illuminate/database
) 的应用程序中使用它作为一个独立的 ORM。
您可以在 https://getstream.io/get_started 注册 Stream 账户。
注意,还有一个适用于所有 PHP 应用程序的底层 PHP - Stream 集成 库。
构建活动流、新闻源等等
您可以构建
- 活动流 - 如 GitHub 上所见
- 类似 Twitter 的源
- Instagram / Pinterest 图片源
- 类似 Facebook 的新闻源
- 通知系统
- 还有很多...
演示
https://github.com/GetStream/Stream-Laravel-Example
https://github.com/GetStream/Stream-Example-PHP
安装
Composer
首先通过 Composer 安装此包。编辑您的项目 composer.json
文件以要求 get-stream/stream-laravel
"require": {
"get-stream/stream-laravel": "~2.3.5"
},
然后,更新 Composer
composer update
Laravel
5.5 之前的 Laravel(不再受支持)
将 'GetStream\StreamLaravel\StreamLaravelServiceProvider'
添加到您的 config/app.php
中的提供者列表
'providers' => [
GetStream\StreamLaravel\StreamLaravelServiceProvider::class,
...
],
并将 FeedManager
门面 'GetStream\StreamLaravel\Facades\FeedManager'
添加到您的 config/app.php
中的别名列表
'aliases' => [
'FeedManager' => GetStream\StreamLaravel\Facades\FeedManager::class,
...
],
发布配置文件
php artisan vendor:publish --provider="GetStream\StreamLaravel\StreamLaravelServiceProvider"
这将创建 config/stream-laravel.php
。我们将在 Stream Dashboard 中创建凭证后设置我们的凭证。
GetStream.io 控制台
现在,登录到 GetStream.io 并在控制台中创建一个应用程序。
检索 API 密钥、API 密钥和 API 应用程序 ID,它们显示在您的控制台中。
在您的新应用程序中创建源。默认情况下,您应该创建以下内容
- user,这是一个 扁平 源。
- timeline,这是一个 扁平 源。
- timeline_aggregated,这是一个 聚合 源。
- notification,这是一个 通知 源。
Stream-Laravel 配置文件
在 config/stream-laravel.php
文件中设置您的密钥、密钥和应用程序 ID,它们如控制台中所显示。另外,设置位置以供参考。例如
return [
/*
|-----------------------------------------------------------------------------
| Your GetStream.io API credentials (you can them from getstream.io/dashboard)
|-----------------------------------------------------------------------------
|
*/
'api_key' => '[API KEY HERE]',
'api_secret' => '[API SECRET HERE]',
'api_app_id' => '[API APP ID HERE]',
/*
|-----------------------------------------------------------------------------
| Client connection options
|-----------------------------------------------------------------------------
|
*/
'location' => 'us-east',
'timeout' => 3,
/*
|-----------------------------------------------------------------------------
| The default feed manager class
|-----------------------------------------------------------------------------
|
*/
您也可以在这里设置您的源名称
/*
|-----------------------------------------------------------------------------
| The feed that keeps content created by its author
|-----------------------------------------------------------------------------
|
*/
'user_feed' => 'user',
/*
|-----------------------------------------------------------------------------
| The feed containing notification activities
|-----------------------------------------------------------------------------
|
*/
'notification_feed' => 'notification',
/*
|-----------------------------------------------------------------------------
| The feeds that shows activities from followed user feeds
|-----------------------------------------------------------------------------
|
*/
'news_feeds' => [
'timeline' => 'timeline',
'timeline_aggregated' => 'timeline_aggregated',
]
这样,您就可以开始使用 Stream-Laravel 了。祝您玩得开心!
Lumen 安装
首先通过 Composer 安装此包。
composer require get-stream/stream-laravel
将 'GetStream\StreamLaravel\StreamLumenServiceProvider'
添加到 bootstrap/app.php
中的提供者列表
$app->register(\GetStream\StreamLaravel\StreamLumenServiceProvider::class);
在 ./config/stream-laravel.php 中手动创建一个配置文件...
<?php return [ 'api_key' => 'API_KEY', 'api_secret' => 'API_SECRET', 'api_app_id' => 'API_APP_ID', 'location' => 'us-east', 'timeout' => 3, ];
并在 bootstrap 中告诉 Lumen 配置它
$app->configure('stream-laravel');
Stream-Laravel 功能
Eloquent 集成
Stream-Laravel 提供与 Eloquent 模型的即时集成 - 扩展 GetStream\StreamLaravel\Eloquent\Activity
类将自动跟踪您的模型到用户源。
例如
class Pin extends Eloquent { use GetStream\StreamLaravel\Eloquent\ActivityTrait;
每次创建一个引脚时,它将被存储在创建它的用户的动态中,当删除一个引脚实例时,它也将被移除。
自动!
活动字段
模型以活动形式存储在动态中。一个活动至少包含以下数据字段:执行者、动词、对象、时间。如果需要,您还可以添加更多自定义数据。
对象是模型实例本身的引用,执行者是实例的用户属性引用,动词是类名的字符串表示。
为了能够即插即用,活动类做出了几个假设
- 模型类属于一个用户
- 模型表有时间戳列(需要created_at)
您可以通过实现以下方法来更改模型实例作为活动存储的方式。
以下是一个示例,说明如果模型属于作者而不是用户,如何更改您的类。
class Pin extends Eloquent { use GetStream\StreamLaravel\Eloquent\ActivityTrait; public function author() { return $this->belongsTo('Author'); } public function activityActorMethodName() { return 'author'; }
活动额外数据
通常,您可能希望存储比基本字段更多的数据。您可以通过在模型中实现activityExtraData
方法来实现这一点。
注意:您应该只返回可以被PHP的json_encode函数序列化的数据
class Pin extends Eloquent { use GetStream\StreamLaravel\Eloquent\ActivityTrait; public function activityExtraData() { return ['is_retweet' => $this->is_retweet]; }
自定义活动动词
默认情况下,动词字段是活动的类名,您可以通过实现activityVerb
方法来更改它。
class Pin extends Eloquent { use GetStream\StreamLaravel\Eloquent\ActivityTrait; public function activityVerb() { return 'pin'; }
动态管理器
Stream Laravel附带了FeedManager类,它可以帮助处理所有常见的动态操作。如果您已定义外观别名(见上面安装部分),则可以使用FeedManager
获取管理器的实例,或者如果您没有,则可以使用App::make('feed_manager')
。
预打包的动态
为了帮助您开始,管理器已经预配置了动态。如果您的应用程序需要,您还可以添加更多动态。这三个动态分为三个类别。
用户动态
用户动态存储了用户的所有活动。将其视为您个人的Facebook页面。您可以从管理器轻松获取此动态。
$feed = FeedManager::getUserFeed($user->id);
新闻动态
新闻动态存储了您关注的人的活动。这里有时间轴(类似于twitter)和聚合时间轴(类似于facebook)。
$timelineFeed = FeedManager::getNewsFeeds($user->id)['timeline']; $aggregatedTimelineFeed = FeedManager::getNewsFeeds($user->id)['timeline_aggregated'];
通知动态
通知动态可以用来构建通知功能。
以下是如何读取通知动态的示例。
notification_feed = FeedManager::getNotificationFeed($user->id);
默认情况下,通知动态将为空。您可以在模型创建时指定要通知哪些用户。在转发推文的情况下,您可能希望通知父推文的用户。
class Tweet extends Eloquent { use GetStream\StreamLaravel\Eloquent\ActivityTrait; public function activityNotify() { if ($this->isRetweet) { $targetFeed = FeedManager::getNotificationFeed($this->parent->user->id); return [$targetFeed]; } }
另一个例子是关注用户。您通常希望通知被关注的用户。
class Follow extends Eloquent { use GetStream\StreamLaravel\Eloquent\ActivityTrait; public function target() { return $this->belongsTo('User'); } public function activityNotify() { $targetFeed = FeedManager::getNotificationFeed($this->target->id); return [$targetFeed]; }
关注动态
要创建新闻动态,您需要通知系统关于关注关系。管理器提供了API,允许一个用户的新闻动态关注另一个用户的动态。此代码允许当前用户的time线和time_line_aggregated动态关注目标用户个人动态。
FeedManager::followUser($userId, $targetId);
显示新闻动态
活动丰富
当您从动态读取数据时,点赞活动将如下所示
{'actor': 'User:1', 'verb': 'like', 'object': 'Like:42'}
这对于在模板中使用来说远远不够。我们称从数据库加载引用的过程为丰富。以下是一个示例
use GetStream\StreamLaravel\Enrich;
$enricher = new Enrich();
$feed = FeedManager::getNewsFeeds(Auth::id())['timeline'];
$activities = $feed->getActivities(0,25)['results'];
$activities = $enricher->enrichActivities($activities);
return View::make('feed', ['activities' => $activities]);
丰富方法返回一个EnrichedActivity
类型对象的数组,您也可以自己解析它。例如,在一个使用spatie/laravel-fractal
的API中,您可以在控制器中使用以下循环来返回JSON到API。
在您的模型中
use App\Transformers\MyModelEnrichTransformer; use GetStream\StreamLaravel\Eloquent\ActivityTrait; use Illuminate\Database\Eloquent\Model; class MyModel extends Model { public function enrichTransformer() { return new MyModelEnrichTransformer(); } }
在您的控制器中
use GetStream\StreamLaravel\Enrich; $feed = FeedManager::getNewsFeeds($user->id)['timeline']; $enricher = new Enrich(); $activities = $feed->getActivities(0, 25)['results']; $activities = $enricher->enrichActivities($activities); $collection = new Collection(); foreach ($activities as $activity) { $record = [ "actor" => $this->transformData($activity["actor"], $activity["actor"]->enrichTransformer()), "object" => $this->transformData($activity["object"], $activity["object"]->enrichTransformer()), "verb" => $activity["verb"], "foreign_id" => $activity["foreign_id"], "time" => $activity["time"], ]; if (!empty($activity["target"])) { array_push($record, [ "target" => $this->transformData($activity["target"], $activity["target"]->enrichTransformer()), ]); } $collection->push($record); } return response()->json($collection);
模板化
现在您已经丰富了活动,您可以在视图中渲染它们。为了方便,我们包括了基本视图
@section('content')
<div class="container">
<div class="container-pins">
@foreach ($activities as $activity)
@include('stream-laravel.render_activity', ['activity' => $activity])
@endforeach
</div>
</div>
@stop
stream-laravel.render_activity
视图标签将渲染视图activity.$activity["verb"],其中活动作为上下文。
例如,activity/tweet.blade.php 将用于渲染动词为 tweet 的普通活动,而 aggregated_activity/like.blade.php 用于动词为 like 的聚合活动
如果您需要支持同一活动的不同模板,您可以发送一个第三个参数来更改视图选择。
以下示例将使用视图 activity/homepage_like.html
@include('stream-laravel.render_activity', ['activity' => $activity, 'prefix' => 'homepage'])
定制增强
有时您可能希望自定义增强的工作方式。文档将向您展示几种常见选项。
增强额外字段
如果您在活动的 extra_data 中存储模型实例的引用,您可以使用 Enrich 类来为您处理。
use \Illuminate\Database\Eloquent\Model;
use GetStream\StreamLaravel\Enrich;
class Pin extends Eloquent {
use GetStream\StreamLaravel\Eloquent\ActivityTrait;
public function activityExtraData()
{
$ref = Utils::createModelReference($this->parentTweet);
return ['parent_tweet' => $ref];
}
// tell the enricher to enrich parent_tweet
$enricher = new Enrich(['actor', 'object', 'parent_tweet']);
$activities = $feed->getActivities(0,25)['results'];
$activities = $enricher->enrichActivities($activities);
预加载数据
您通常会访问相关对象,例如 activity['object']->user。为了避免您的新闻源运行 N 次查询,您可以指示管理器加载相关对象。管理器将使用 Eloquent 的 With
功能。
class Pin extends Eloquent {
use GetStream\StreamLaravel\Eloquent\ActivityTrait;
public function activityLazyLoading()
{
return ['user'];
}
完整文档和低级 API 访问
当需要时,您也可以直接使用 低级 PHP API。文档可在 Stream 网站 上找到。
$specialFeed = FeedManager::getClient->feed('special', '42')
$specialFeed->followFeed('timeline', '60')
贡献
我们欢迎改进此库或修复问题的代码更改,请确保在提交 GitHub 上的拉取请求之前遵循所有最佳实践,并在适用的情况下添加测试。我们非常乐意将您的代码合并到官方仓库中。请确保首先签署我们的 贡献者许可协议 (CLA)。有关更多详细信息,请参阅我们的许可文件。
入门
$ composer install $ ./vendor/bin/phpunit
版权和许可信息
版权(c)2014-2022 Stream.io Inc,以及个别贡献者。保留所有权利。
请参阅“LICENSE”文件,了解此软件的历史、使用条款和条件以及所有保证的放弃。