codificar/交流

交流是一个基于Laravel 5的实时消息、聊天和对话系统。它帮助您轻松地开发用户消息、聊天和对话。

2.3.6 2022-12-27 21:55 UTC

README

Awesome Laravel GitHub license Build Status

交流是一个基于Laravel 5的用户对话(收件箱)系统,具有实时消息功能。您可以轻松地将此包集成到任何基于Laravel的项目中。它帮助您在几分钟内开发消息系统。以下是使用交流开发的项目的截图。

交流v2.1.0支持实时消息。了解更多关于交流实时消息的信息。

反馈

如果您已经使用过交流,请与我们分享您的体验。这将使项目变得更好。

给我们您的反馈

用交流构建

如果您在项目中使用交流,请与我们分享您的项目URL或项目名称。这将激励其他人使用交流。

查看使用交流构建的项目

注意

请不要直接从其更高版本迁移1.1.7。请先尝试我们的示例项目,然后再将其应用到您的项目中。

Talk-Example Screenshot

您可以尝试交流示例项目。

或者您可以通过使用此凭据尝试在线演示

username: admin   
password: admin

那么让我们开始您的之旅吧:)

功能

  • 一对一消息
  • 实时消息
  • 创建新的对话
  • 显示最新的消息线程
  • 通过用户ID或对话ID查看对话
  • 支持线程和消息的分页
  • 从两端删除(软删除)消息。发送者和接收者都可以从他们的端删除他们的消息
  • 永久删除消息
  • 标记消息为已读
  • 只有参与者可以查看或访问他们的消息或消息线程
  • 使用oembed规范进行内联URL渲染

安装

交流是一个Laravel包,因此您可以通过Composer安装它。从您的项目目录在终端中运行此命令

composer require nahid/talk

请稍等片刻,Composer会自动将交流安装到您的项目中。

配置

下载完成后,您必须在config/app.php配置文件中调用此包服务。为此,在app.php中的providers部分添加此行

Nahid\Talk\TalkServiceProvider::class,

要使用外观,您必须在app.php中的aliases数组中添加此行

'Talk'      => Nahid\Talk\Facades\Talk::class,

现在在您的终端中运行此命令以发布此包资源

php artisan vendor:publish --provider="Nahid\Talk\TalkServiceProvider"

运行此命令后,所有必要的文件都将包含在您的项目中。此包有两个默认迁移。因此,您必须运行如下迁移命令。(但请确保您的数据库配置已正确配置。)

php artisan migrate

好的,现在您需要为交流配置用户模型。转到config/talk.php并对其进行配置

return [
    'user' => [
        'model' => 'App\User',
        'foreignKey' => null,
        'ownerKey' => null
    ],
    'broadcast' => [
        'enable' => false,
        'app_name' => 'your-app-name',
        'pusher' => [
            'app_id'        => '',
            'app_key'       => '',
            'app_secret'    => '',
            'options' => [
                 'cluster' => 'ap1',
                 'encrypted' => true
            ]
        ]
    ],
    'oembed' => [
        'enabled' => false,
        'url' => null,
        'key' => null
    ]
];

用法

使用它非常简单。如果您想全局设置认证用户ID,则必须首先设置一个中间件。转到app/Http/Kernel.php并在$routeMiddleware数组中设置它

'talk'  =>  \Nahid\Talk\Middleware\TalkMiddleware::class,

现在您可以通过中间件在任何地方使用它。假设您有一个控制器,并且您想在全局设置认证用户ID,那么在控制器构造函数中写入以下内容:

$this->middleware('talk');

但是,您可以在控制器的任何方法中使用这些程序,而不是全局设置ID。

Talk::setAuthUserId(auth()->user()->id);

现在您可以使用您需要的任何方法。但如果是想立即传递认证ID,这个方法可能有助于您。

Talk::user(auth()->user()->id)->anyMethodHere();

请参阅API文档。

API列表

setAuthUserId

setAuthUserId 方法设置当前登录用户ID,您通过参数传递。如果传递 nullempty 值,则返回 false。

语法

void setAuthUserId($userid)

示例

控制器构造函数是编写此方法的最佳位置。

function __construct()
{
    Talk::setAuthUserId(auth()->user()->id);
}

当您传递登录用户ID时,Talk 将知道当前系统认证的是谁。因此,Talk 将基于此用户检索所有信息。

user

您可以使用此方法而不是 setAuthUserId() 方法。当您需要立即访问用户的对话时,您可以使用它。语法

object user($id)

示例 当您没有全局设置认证用户ID时,您可以直接使用此方法与其他方法一起使用。

$inboxes = Talk::user(auth()->user()->id)->threads();
return view('messages.threads', compact('inboxes'));

isConversationExists

此方法检查当前登录用户,并确定给定的用户是否已经在对话中。

语法

int|false isConversationExists($userid)

示例

if ($conversationId = Talk::isConversationExists($userId)) {
    Talk::sendMessage($conversationId, $message);
} 

isAuthenticUser

isAuthenticUser 检查给定用户是否在给定对话中存在。

语法

boolean isAuthenticUser($conversationId, $userId)

示例

if (Talk::isAuthenticUser($conversationId, $userId)) {
    Talk::sendMessage($conversationId, $message);
} 

sendMessage

您可以通过使用此方法通过对话ID发送消息。如果消息成功发送,它将返回消息模型的对象,否则返回 false

语法

object|false sendMessage($conversationId, $message)

示例

    $message = Talk::sendMessage($conversationId, $message);
    if ($message) {
        return response()->json(['status'=>'success', 'data'=>$message], 200);
   }

sendMessageByUserId

您可以通过使用此方法通过接收者ID发送消息。如果消息成功发送,它将返回消息模型的对象,否则返回 false

语法

object|false sendMessageByUserId($userId, $message)

getInbox

如果您想获取所有除软删除消息之外的信箱,此方法可能有助于您。此方法通过先前分配的认证用户ID获取所有信箱。它返回带有最新消息的消息线程集合。

语法

array getInbox([$order = 'desc'[,$offset = 0[, $take = 20]]])

示例

// controller method
$inboxes = Talk::getInbox();
return view('message.threads', compact('inboxes'));
<!-- messages/threads.blade.php -->
<ul>
    @foreach($inboxes as $inbox)
        <li>
            <h2>{{$inbox->withUser->name}}</h2>
            <p>{{$inbox->thread->message}}</p>
            <span>{{$inbox->thread->humans_time}}</span>
        </li>
    @endforeach
</ul>

getInboxAll

它与 getInbox() 方法类似。如果您想获取包含软删除消息的所有信箱,此方法可能有助于您。此方法通过给定的用户ID获取所有信箱。

语法

object getInboxAll([$order = 'desc'[,$offset = 0[, $take = 20]]])

threads

这是 getInbox() 方法的别名。

语法

array threads([$order = 'desc'[,$offset = 0[, $take = 20]]])

threadsAll

这是 getInboxAll() 方法的别名。

语法

array threadsAll([$order = 'desc'[,$offset = 0[, $take = 20]]])

getConversationsById

当您想使用您选择的对话ID获取所有对话时,您可以尝试此方法。此方法返回所有对话(除软删除外),并包含 senderwithUser 对象。

语法

array getConversationsById($conversationId[, $offset = 0[, $take = 20]])

示例

// controller method
$conversations = Talk::getConversationsById($conversationId);
$messages = $conversations->messages;
$withUser = $conversations->withUser;

return view('messages.conversations', compact('messages', 'withUser'));

此方法返回两个对象 messageswithUser。其中 messages 对象包含消息集合,而 withUser 对象包含参与者用户集合。

让我们看看如何在使用视图时使用它。

<!-- messages/conversations.blade.php -->
<div class="message-container">
    <h2>Chat with {{$withUser->name}}</h2>
    @foreach ($messages as $msg)
     <div class="message">
        <h4>{{$msg->sender->name}}</h4>
        <span>{{$msg->humans_time}}</span>
        <p>
            {{$msg->message}}
       </p> 
    </div>
    @endforeach
</div>

getConversationsAllById

此方法类似于 getConversationsById()。这两个方法之间的唯一区别是这个方法返回所有包含软删除项的消息。

语法

array getConversationsAllById($conversationId[, $offset = 0[, $take = 20]])

getConversationsByUserId

当您想使用您选择的接收者ID获取所有对话时,您可以尝试此方法。此方法返回所有对话(除软删除消息外),并包含用户对象。

语法

object getConversationsByUserId($receiverId [, $offset = 0[, $take = 20]])

getConversationsAllByUserId

此方法类似于 getConversationsByUserId()。这两个方法之间的唯一区别是这个方法返回所有包含软删除项的消息。

语法

array getConversationsAllByUserId($receiverId[, $offset = 0[, $take = 20]])

getMessages

这是 getConversationsById() 方法的别名。

语法

array messages($conversationId[, $offset = 0[, $take = 20]])

getMessagesAll

这是 getConversationsAllById() 方法的别名。

语法

array messagesAll($conversationId[, $offset = 0[, $take = 20]])

getMessagesByUserId

这是 getConversationsByUserId() 方法的别名。

语法

array messagesByUserId($receiverId[, $offset = 0[, $take = 20]])

getMessagesAllByUserId

这是 getConversationsAllByUserId() 方法的别名。

语法

array messagesAllByUserId($receiverId[, $offset = 0[, $take = 20]])

readMessage

如果您想读取一条单独的消息,可以使用它。该消息通过消息 ID 返回单个消息对象。

语法

array readMessage($messageId)

getReceiverInfo

此方法返回关于消息接收者的所有信息。

此方法从版本 2.0.0 开始已弃用,并将在版本 2.0.2 中被移除。

语法

object getReceiverInfo($conversationId)

makeSeen

如果您想将消息设置为已读,可以使用此方法。

语法

boolean makeSeen($messageId)

deleteMessage

当您想从对话中删除特定消息时,必须使用此方法。此方法对用户端个别进行软删除。

语法

boolean deleteMessage($messageId)

deleteForever

如果您想硬删除或永久删除特定消息,则必须使用此方法。

语法

boolean deleteForever($messageId)

deleteConversations

此方法用于永久删除所有对话。

语法

boolean deleteConversations($conversationId)

实时消息

Talk 也支持实时消息,称为 Talk-Live。Talk 使用 Pusher 进行实时消息。因此,首先您必须配置 Pusher。再次前往 app/talk.php 并进行配置。

return [
    'user' => [
        'model' => 'App\User'
    ],
    'broadcast' => [
        'enable' => false,
        'app_name' => 'your-app-name',
        'pusher' => [
            'app_id'        => '',
            'app_key'       => '',
            'app_secret'    => ''
        ]
    ]
];

在此新版本中,已添加带有 Talk 配置的广播部分。默认情况下,广播是禁用的。如果您想启用实时(实时)消息,则必须首先启用它。然后添加 Pusher 凭据。就是这样。每次您发送消息时,Talk 都会自动触发两个事件,一个用于特定用户,另一个用于特定对话。因此,您可以根据自己的意愿监听或订阅一个或两个。最后,您必须使用 talk_live() 辅助函数订阅这些事件。前往您想订阅以处理消息数据的地方,按照以下代码进行。

<script>
    var msgshow = function(data) {
        // write what you want with this data
        
        console.log(data);
    }
</script>

{!! talk_live(['user'=>["id"=>auth()->user()->id, 'callback'=>['msgshow']]]) !!}

talk_live() 支持一个参数作为数组。第一个参数是您要订阅的频道名称。您不知道哪个频道进行了广播。Talk 默认广播两个频道。一个是用户频道,另一个是对话频道。如果您想订阅当前登录用户的频道,则必须在 'user' 键中传递登录用户 ID。

例如:['user'=>['id'=>auth()->user()->id, 'callback'=>[]] 或者您想订阅对话 ID,则必须以 'conversation' 键传递对话 ID。['conversation'=>['id'=>$conversationID, 'callback'=>[]]。如果您想同时订阅两者,也可以。

您可以为处理 Pusher 接收到的数据传递一个回调。对于 userconversation 部分,都支持回调作为数组。因此,您可以传递多个回调作为数组值,如前例所示。

您可以观看 Talk-Live-Demo

Oembed 支持

Talk 也支持嵌入 URL,只需在您的视图中使用 $message->toHtmlString() 来渲染嵌入链接。

例如:这是一个 YouTube 嵌入链接:https://www.youtube.com/watch?v=jNQXAC9IVRw

<div class="message-container">
    <h2>Chat with {{$withUser->name}}</h2>
    @foreach ($messages as $msg)
     <div class="message">
        <h4>{{$msg->sender->name}}</h4>
        <span>{{$msg->humans_time}}</span>
        <p>
            {{$msg->toHtmlString()}}
       </p> 
    </div>
    @endforeach
</div>

自定义嵌入链接

如果您想设置自己的 oembed 实现,可以在 Talk 配置文件中配置它。您的端点应遵循 Oembed 规范。

    'user' => [
        'model' => 'App\User',
        'foreignKey' => null,
        'ownerKey' => null
    ],
    'broadcast' => [
        'enable' => false,
        'app_name' => 'your-app-name',
        'pusher' => [
            'app_id'        => '',
            'app_key'       => '',
            'app_secret'    => '',
            'options' => [
                 'cluster' => 'ap1',
                 'encrypted' => true
            ]
        ]
    ],
    'oembed' => [
        'enabled' => true,
        'url' => 'http://your.domain/api/oembed',
        'key' => 'yout-auth-api-key'
    ]

测试

Talk 与 php 5.5 兼容。使用 Docker 运行单元测试。

docker-compose run php55 composer install
docker-compose run php55 phpunit
docker-compose run php56 composer install
docker-compose run php56 phpunit
docker-compose run php7 composer install
docker-compose run php7 phpunit
docker-compose run hhvm composer install
docker-compose run hhvm phpunit

尝试演示项目

Talk-Example

特别感谢

Shipu Ahamed

谢谢 :)

支持此项目

嘿,兄弟!帮帮我几个 🍻!

Beerpay Beerpay