Skip to content

Talk 是 Laravel 的实时用户消息和聊天系统。

License

Notifications You must be signed in to change notification settings

yuanzhongqiao/talk-dpqq-cn

 
 

Repository files navigation

Laravel-Talk

很棒的 Laravel GitHub 许可证 构建状态 MadeWithLaravel.com 屏蔽

Talk 是 Laravel 的一个具有实时消息传递功能的用户对话(聊天)系统。您可以轻松地将这个包与任何基于 Laravel 的项目集成。它可以帮助您在短短几分钟内开发一个消息系统。这是由 Talk 开发的项目屏幕截图。

Talk v2.1.0 支持实时消息传递。了解有关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配置文件中调用此包服务。为此,请在部分中添加以下app.phpproviders

Nahid\Talk\TalkServiceProvider::class,

要使用外观,您必须在数组中添加此app.phpaliases

'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,
    ],
<span class="pl-s">'broadcast'</span> =&gt; [
    <span class="pl-s">'enable'</span> =&gt; <span class="pl-c1">true</span>,
    <span class="pl-s">'app_name'</span> =&gt; <span class="pl-s">'talk-example'</span>,
    <span class="pl-s">'driver'</span> =&gt; env(<span class="pl-s">'TALK_BROADCAST_DRIVER'</span>, <span class="pl-s">'pusher'</span>), <span class="pl-c">// pusher or laravel-websockets</span>
    <span class="pl-s">'pusher'</span> =&gt; [
        <span class="pl-s">'app_id'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_ID'</span>, <span class="pl-s">''</span>),
        <span class="pl-s">'app_key'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_KEY'</span>, <span class="pl-s">''</span>),
        <span class="pl-s">'app_secret'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_SECRET'</span>, <span class="pl-s">''</span>),
        <span class="pl-s">'options'</span> =&gt; [
            <span class="pl-s">'cluster'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_CLUSTER'</span>, <span class="pl-s">'ap2'</span>),
            <span class="pl-s">'encrypted'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_ENCRYPTION'</span>, <span class="pl-c1">false</span>),
            <span class="pl-s">'host'</span> =&gt; <span class="pl-s">'127.0.0.1'</span>,
            <span class="pl-s">'port'</span> =&gt; env(<span class="pl-s">'LARAVEL_WEBSOCKETS_PORT'</span>, <span class="pl-c1">6001</span>),
            <span class="pl-s">'scheme'</span> =&gt; <span class="pl-s">'http'</span>,
            <span class="pl-s">'wsHost'</span> =&gt; <span class="pl-s">'127.0.0.1'</span>,
            <span class="pl-s">'wsPort'</span> =&gt; env(<span class="pl-s">'LARAVEL_WEBSOCKETS_PORT'</span>, <span class="pl-c1">6001</span>),
            <span class="pl-s">'forceTLS'</span> =&gt; <span class="pl-c1">false</span>,
            <span class="pl-s">'disableStats'</span> =&gt; <span class="pl-c1">true</span>
        ]
    ],
],


<span class="pl-s">'oembed'</span> =&gt; [
    <span class="pl-s">'enabled'</span> =&gt; <span class="pl-c1">false</span>,
    <span class="pl-s">'url'</span> =&gt; <span class="pl-s">''</span>,
    <span class="pl-s">'key'</span> =&gt; <span class="pl-s">''</span>
]

];

<clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w" value="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' => ''
]

];" tabindex="0" role="button">

用法

它非常容易使用。如果你想全局设置验证用户 ID,那么你必须先设置一个中间件。转到数组app/Http/Kernel.php并将其设置为$routeMiddleware

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

现在您可以通过中间件从任何地方使用它。假设您有一个控制器,并且想要全局设置身份验证用户 ID,然后在控制器构造函数中写入:

$this->middleware('talk');

但是,您可以从控制器中的任何方法使用这些过程,而不是全局设置 id:

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

现在您可以使用您需要的任何方法。但如果想立即通过真实的身份证,这个方法可能会帮助你:

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

请参阅 API 文档。

API列表

设置验证用户ID

setAuthUserId方法设置当前登录的用户 ID,您可以通过参数传递该 ID。如果你传递nullorempty值,那么它返回 false。

句法

void setAuthUserId($userid)

例子

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

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

当您传递登录的用户 ID 时,Talk 将知道当前谁已通过该系统的身份验证。So Talk 检索基于该用户的所有信息。

用户

您可以使用此方法来代替setAuthUserId()方法。当您必须立即访问用户对话时,您可以使用它。 句法

object user($id)

示例 当您没有全局设置经过身份验证的用户 ID 时,您只需直接将此方法与其他方法一起使用即可。

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

会话是否存在

此方法检查当前登录的用户以及给定的用户是否已在对话中

句法

int|false isConversationExists($userid)

例子

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

是真实用户

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

句法

boolean isAuthenticUser($conversationId, $userId)

例子

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

发信息

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

句法

object|false sendMessage($conversationId, $message)

例子

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

按用户ID发送消息

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

句法

object|false sendMessageByUserId($userId, $message)

获取收件箱

如果您想获取除软删除邮件之外的所有收件箱,此方法可能会帮助您。此方法通过先前分配的经过身份验证的用户 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>

获取收件箱全部

其与方法类似getInbox()。如果您想获取所有包含软删除邮件的收件箱,此方法可能会帮助您。此方法通过给定的用户 ID 获取所有收件箱。

句法

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

线程

该方法是方法的别名getInbox()

句法

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

线程全部

该方法是方法的别名getInboxAll()

句法

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

获取ConversationsById

当你想使用你想要的对话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'));

<clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w" value="// controller method $conversations = Talk::getConversationsById($conversationId); $messages = $conversations->messages; $withUser = $conversations->withUser;

return view('messages.conversations', compact('messages', 'withUser'));" tabindex="0" role="button">

该方法返回两个对象messageswithUsermessages对象包含消息集合,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]])

按用户 ID 获取对话

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

句法

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

按用户 ID 获取所有对话

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

句法

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

获取消息

这是方法的别名 getConversationsById()

句法

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

获取全部消息

这是方法的别名 getConversationsAllById()

句法

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

按用户 ID 获取消息

这是方法的别名 getConversationsByUserId()

句法

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

按用户 ID 获取所有消息

这是方法的别名 getConversationsAllByUserId()

句法

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

读消息

如果您想阅读一条消息,那么您可以使用它。该消息通过消息id返回单个消息对象。

句法

array readMessage($messageId)

获取接收者信息

该方法返回消息接收者的所有信息。

此方法从 2.0.0 版本开始已弃用,将从 2.0.2 版本中删除

句法

object getReceiverInfo($conversationId)

使见

如果您想设置如图所示的消息,可以使用此方法。

句法

boolean makeSeen($messageId)

删除消息

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

句法

boolean deleteMessage($messageId)

永久删除

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

句法

boolean deleteForever($messageId)

删除对话

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

句法

boolean deleteConversations($conversationId)

实时消息传递

Talk 还支持实时消息传递,称为 Talk-Live。Talk 支持推送器和 laravel-websocket 用于实时消息传递。所以首先你必须配置 Pusher 或 laravel-websocket。再次进入app/talk.php并配置。

return [
    'user' => [
        'model' => 'App\User',
        'foreignKey' => null,
        'ownerKey' => null,
    ],
<span class="pl-s">'broadcast'</span> =&gt; [
    <span class="pl-s">'enable'</span> =&gt; <span class="pl-c1">true</span>,
    <span class="pl-s">'app_name'</span> =&gt; <span class="pl-s">'talk-example'</span>,
    <span class="pl-s">'driver'</span> =&gt; env(<span class="pl-s">'TALK_BROADCAST_DRIVER'</span>, <span class="pl-s">'pusher'</span>), <span class="pl-c">// pusher or laravel-websockets</span>
    <span class="pl-s">'pusher'</span> =&gt; [
        <span class="pl-s">'app_id'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_ID'</span>, <span class="pl-s">''</span>),
        <span class="pl-s">'app_key'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_KEY'</span>, <span class="pl-s">''</span>),
        <span class="pl-s">'app_secret'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_SECRET'</span>, <span class="pl-s">''</span>),
        <span class="pl-s">'options'</span> =&gt; [
            <span class="pl-s">'cluster'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_CLUSTER'</span>, <span class="pl-s">'ap2'</span>),
            <span class="pl-s">'encrypted'</span> =&gt; env(<span class="pl-s">'PUSHER_APP_ENCRYPTION'</span>, <span class="pl-c1">false</span>),
            <span class="pl-s">'host'</span> =&gt; <span class="pl-s">'127.0.0.1'</span>,
            <span class="pl-s">'port'</span> =&gt; env(<span class="pl-s">'LARAVEL_WEBSOCKETS_PORT'</span>, <span class="pl-c1">6001</span>),
            <span class="pl-s">'scheme'</span> =&gt; <span class="pl-s">'http'</span>,
            <span class="pl-s">'wsHost'</span> =&gt; <span class="pl-s">'127.0.0.1'</span>,
            <span class="pl-s">'wsPort'</span> =&gt; env(<span class="pl-s">'LARAVEL_WEBSOCKETS_PORT'</span>, <span class="pl-c1">6001</span>),
            <span class="pl-s">'forceTLS'</span> =&gt; <span class="pl-c1">false</span>,
            <span class="pl-s">'disableStats'</span> =&gt; <span class="pl-c1">true</span>
        ]
    ],
],


<span class="pl-s">'oembed'</span> =&gt; [
    <span class="pl-s">'enabled'</span> =&gt; <span class="pl-c1">false</span>,
    <span class="pl-s">'url'</span> =&gt; <span class="pl-s">''</span>,
    <span class="pl-s">'key'</span> =&gt; <span class="pl-s">''</span>
]

];

<clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w" value="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' => ''
]

];" tabindex="0" role="button">

在这个新版本中,广播部分添加了谈话配置。这里广播默认是禁用的。如果您想启用实时消息传递,那么您必须首先启用它。然后将推送器凭据添加到您的 .env 文件,并且您必须在 .env 文件中添加一个名为 PUSHER_APP_NAME 的新行来指定您的应用程序推送器名称。就是这样。每次发送消息时,谈话都会自动触发两个事件,一个用于特定用户,第二个用于特定对话。因此,您可以根据自己的意愿收听或订阅其中之一或两者。最后,您必须使用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']]]) !!}

<clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w" value="<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']]]) !!}" tabindex="0" role="button">

talk_live()支持一个参数作为数组。第一个参数是您要订阅的频道名称。您不知道哪个频道播出。Talk默认广播两个频道。一个用于用户,第二个用于对话。如果您想为当前登录的用户订阅频道,那么您必须通过

'user' 键中的登录用户 ID。['user'=>['id'=>auth()->user()->id, 'callback'=>[]]或者您想订阅对话 ID,您已将对话 ID 作为“对话”键传递。['conversation'=>['id'=>$conversationID, 'callback'=>[]]。如果你愿意的话,你可以同时通过。

您可以传递回调来处理推送器收到的数据。对于 和user部分conversation,都支持以数组形式回调。因此,您可以将多个回调作为数组值传递,如上一个示例所示。

您可以观看Talk-Live-Demo

嵌入支持

Talk 还支持嵌入 url,只需$message->toHtlmString()在您的视图中使用即可呈现嵌入链接

例如。This is a youtube embed link: 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'
    ]
http://your.domain/api/oembed', 'key' => 'yout-auth-api-key' ]" tabindex="0" role="button">

测试

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

尝试演示项目

谈话-例子

特别感谢

施普·艾哈迈德

谢谢 :)

对这个项目的支持

你好,哥们儿!帮我几个🍻!

啤酒支付 啤酒支付

About

Talk 是 Laravel 的实时用户消息和聊天系统。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • PHP 94.3%
  • Dockerfile 3.8%
  • Blade 1.9%