nahid / talk
Talk 是一个基于 Laravel 的实时消息、聊天和对话系统。它可以帮助您轻松开发用户消息、聊天和对话。
Requires
- php: >=5.6
- illuminate/contracts: >=5.1.0
- illuminate/support: >=5.1.0
- mpratt/embera: ^1.9
- nesbot/carbon: ^2.22
- predis/predis: ~1.1.1
- pusher/pusher-php-server: ^5.0
Requires (Dev)
- ext-json: *
- graham-campbell/testbench: ^3.1 || ^4.0 || ^5.0
- phpunit/phpunit: ^4.8 || ^5.0 || ^7.0 || ^8.0
README
Talk 是一个基于 Laravel 的实时消息(聊天)系统,您可以将此包轻松集成到任何 Laravel 项目中。它可以帮助您在几分钟内开发消息系统。以下是 Talk 开发的项目截图。
Talk v2.1.0 支持实时消息。了解更多关于 Talk Live Messaging
反馈
如果您已经使用了 Talk,请与我们分享您的体验。这将使项目变得更好。
用 Talk 构建
如果您在项目中使用 Talk,请与我们分享您的项目 URL 或项目名称。这将激励其他人使用 Talk。
查看哪些项目是 用 Talk 构建 的。
注意
不要直接从更高版本迁移 1.1.7。请首先尝试我们的 示例项目,然后再将其应用于您的项目。
您可以尝试 Talk-Example 项目。
或者您可以通过使用此凭据尝试使用此凭据进行实时 演示
username: admin
password: admin
所以让我们开始您的之旅吧:)
功能
- 一对一消息
- 实时消息
- 创建新的对话
- 查看最新的消息线程
- 按用户 ID 或对话 ID 查看对话
- 支持线程和消息的分页
- 从两端删除(软删除)消息。发送者和接收者可以从他们的端删除他们的消息
- 永久删除消息
- 将消息标记为已读
- 只有参与者可以查看或访问他们的消息或消息线程
- 使用 oembed 规范内联渲染 URL
安装
Talk 是一个 Laravel 包,您可以通过 Composer 安装它。在您的项目目录中,从终端运行此命令
composer require nahid/talk
稍等片刻,Composer 将自动在您的项目中安装 Talk。
配置
下载完成后,您必须在 config/app.php
配置文件中调用此包服务。为此,在 providers
部分中添加此行到 app.php
Nahid\Talk\TalkServiceProvider::class,
要使用外观,您必须将此行添加到 app.php
中的 aliases
数组
'Talk' => Nahid\Talk\Facades\Talk::class,
现在,在您的终端中运行此命令以发布此包资源
php artisan vendor:publish --provider="Nahid\Talk\TalkServiceProvider"
运行此命令后,所有必要的文件都将包含在您的项目中。此包有两个默认迁移。因此,您必须运行以下迁移命令。(但请确保您的数据库配置正确。)
php artisan migrate
好的,现在您需要配置 Talk 的用户模型。转到 config/talk.php
并进行配置
return [ 'user' => [ 'model' => 'App\User', 'foreignKey' => null, 'ownerKey' => null, ], 'broadcast' => [ 'enable' => true, 'app_name' => 'talk-example', 'driver' => env('TALK_BROADCAST_DRIVER', 'pusher'), // pusher or laravel-websockets 'pusher' => [ 'app_id' => env('PUSHER_APP_ID', ''), 'app_key' => env('PUSHER_APP_KEY', ''), 'app_secret' => env('PUSHER_APP_SECRET', ''), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER', 'ap2'), 'encrypted' => env('PUSHER_APP_ENCRYPTION', false), 'host' => '127.0.0.1', 'port' => env('LARAVEL_WEBSOCKETS_PORT', 6001), 'scheme' => 'http', 'wsHost' => '127.0.0.1', 'wsPort' => env('LARAVEL_WEBSOCKETS_PORT', 6001), 'forceTLS' => false, 'disableStats' => true ] ], ], 'oembed' => [ 'enabled' => false, 'url' => '', 'key' => '' ] ];
使用方法
它的使用非常简单。如果您想全局设置认证用户 ID,则必须首先设置一个中间件。转到 app/Http/Kernel.php
并在 $routeMiddleware
数组中设置它
'talk' => \Nahid\Talk\Middleware\TalkMiddleware::class,
现在您可以从任何中间件中使用它。假设您有一个控制器,并且您想在全局设置认证用户 ID,那么在控制器构造函数中写入此内容
$this->middleware('talk');
但您也可以从控制器中的任何方法使用这些程序
Talk::setAuthUserId(auth()->user()->id);
现在您可以使用您需要的任何方法。但如果你想立即传递认证ID,这种方法可能有助于您
Talk::user(auth()->user()->id)->anyMethodHere();
请参阅API文档。
API列表
- setAuthUserId
- user
- isConversationExists
- isAuthenticUser
- sendMessage
- sendMessageByUserId
- getInbox
- getInboxAll
- threads
- threadsAll
- getConversationsById
- getConversationsAllById
- getConversationsByUserId
- getConversationsAllByUserId
- getMessages
- getMessagesByUserId
- getMessagesAll
- getMessagesAllByUserId
- readMessage
- makeSeen
- getReceiverInfo
- deleteMessage
- deleteForever
- deleteConversations
setAuthUserId
setAuthUserId
方法用于设置当前登录用户的ID,您可以通过参数传递。如果您传递null
或empty
值,则返回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获取所有会话时,您可以尝试此方法。此方法返回所有会话(除了软删除的)以及sender
和withUser
对象。
语法
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'));
此方法返回两个对象messages
和withUser
。其中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 和 laravel-websocket 进行实时消息。因此,首先您需要配置 pusher 或 laravel-websocket。再次访问 app/talk.php
进行配置。
return [ 'user' => [ 'model' => 'App\User', 'foreignKey' => null, 'ownerKey' => null, ], 'broadcast' => [ 'enable' => true, 'app_name' => 'talk-example', 'driver' => env('TALK_BROADCAST_DRIVER', 'pusher'), // pusher or laravel-websockets 'pusher' => [ 'app_id' => env('PUSHER_APP_ID', ''), 'app_key' => env('PUSHER_APP_KEY', ''), 'app_secret' => env('PUSHER_APP_SECRET', ''), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER', 'ap2'), 'encrypted' => env('PUSHER_APP_ENCRYPTION', false), 'host' => '127.0.0.1', 'port' => env('LARAVEL_WEBSOCKETS_PORT', 6001), 'scheme' => 'http', 'wsHost' => '127.0.0.1', 'wsPort' => env('LARAVEL_WEBSOCKETS_PORT', 6001), 'forceTLS' => false, 'disableStats' => true ] ], ], 'oembed' => [ 'enabled' => false, 'url' => '', 'key' => '' ] ];
在新版本中,添加了带有 Talk 配置的广播部分。默认情况下,广播是禁用的。如果您想启用实时(实时)消息,则必须首先启用它。然后,将 pusher 凭据添加到您的 .env 文件中,并且必须在 .env 文件中添加一个新行,称为 PUSHER_APP_NAME,以指定您的应用程序 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 默认广播两个频道。一个是用户频道,另一个是对话频道。如果您想订阅当前登录用户的频道,则必须传递
登录用户 ID 作为 'user' 键。 ['user'=>['id'=>auth()->user()->id, 'callback'=>[]]
或者您想订阅对话 ID,则必须将对话 ID 作为 'conversation' 键传递。 ['conversation'=>['id'=>$conversationID, 'callback'=>[]]
。如果需要,您可以同时传递这两个。
您可以传递一个回调来处理收到的 pusher 数据。对于 user
和 conversation
部分,都支持回调作为数组。因此,您可以像前面的例子那样传递多个回调作为数组值。
您可以观看 Talk-Live-Demo
Oembed 支持
Talk 也支持嵌入 URL,只需在您视图中使用 $message->toHtlmString()
来渲染嵌入链接
例如:这是一个 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' => [ ... ], ... ], '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
尝试演示项目
特别感谢
谢谢 :)
支持此项目
嘿,伙计!帮我几个 🍻!