get-stream/stream-laravel

使用 getstream.io 在 Laravel 上构建新闻源和活动源

3.0.1 2023-03-16 10:34 UTC

README

Build Status PHP version

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;

每次创建一个引脚时,它将被存储在创建它的用户的动态中,当删除一个引脚实例时,它也将被移除。

自动!

活动字段

模型以活动形式存储在动态中。一个活动至少包含以下数据字段:执行者动词对象时间。如果需要,您还可以添加更多自定义数据。

对象是模型实例本身的引用,执行者是实例的用户属性引用,动词是类名的字符串表示。

为了能够即插即用,活动类做出了几个假设

  1. 模型类属于一个用户
  2. 模型表有时间戳列(需要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

以下是如何读取通知动态的示例。

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”文件,了解此软件的历史、使用条款和条件以及所有保证的放弃。