向您的 Laravel 应用程序添加实时聊天小部件。
借助此软件包,您可以通过提供无缝集成的动态和交互式实时聊天小部件功能来增强用户参与度、促进协作并促进现有 Laravel 应用程序中的即时通信。
地下室名称的灵感来自于《头号玩家》中 Aech 的私人聊天室。
这是使用 Laravel Breeze 的脚手架演示。
php ^8.0
和laravel/framework ^9.0.0 | ^10.0.0
安装在您的项目中。chrome >= 80
、 edge >= 80
、 firefox >= 74
或同等版本。请参阅此处的详细信息。打开终端,并确保您位于 Laravel 项目目录中。
使用以下命令安装此软件包:
composer require basement-chat/basement-chat
开始将basement chat与您的 Laravel 应用程序集成:
php artisan basement:install
上面的命令会将配置、资产和迁移文件发布到您的 Laravel 应用程序。另一方面,它还会询问交互式问题来运行数据库迁移,并要求您安装将使用哪个广播驱动程序。
选择广播驱动程序
在选择广播驱动程序之前,您需要通过取消注释或将其添加到config/app.php
中的providers
来确保启用BroadcastServiceProvider::class
/*
* Application Service Providers...
*/
AppProvidersAppServiceProvider::class,
AppProvidersAuthServiceProvider::class,
- // AppProvidersBroadcastServiceProvider::class,
+ AppProvidersBroadcastServiceProvider::class,
AppProvidersEventServiceProvider::class,
AppProvidersRouteServiceProvider::class,
然后您可以选择以下驱动程序之一:
如果您在上一步中不小心错过了安装驱动程序,可以使用
php artisan basement:install driver
命令重新安装。
在 Pusher 帐户中创建新频道后,您需要通过提供相关配置来配置 Laravel .env
:
BASEMENT_BROADCAST_DRIVER =pusher
BROADCAST_DRIVER =pusher
PUSHER_APP_ID =<replace-with-your-pusher-app-id>
PUSHER_APP_KEY =<replace-with-your-pusher-key>
PUSHER_APP_SECRET =<replace-with-your-pusher-secret>
PUSHER_APP_CLUSTER =<replace-with-your-pusher-cluster>
在您的 Ably 帐户中创建新应用程序后,在.env
中提供相关配置:
BASEMENT_BROADCAST_DRIVER =ably
BROADCAST_DRIVER =ably
ABLY_KEY =<replace-with-your-ably-key>
ABLY_PUBLIC_KEY =<replace-with-your-ably-public-key>
首先使用以下配置配置您的.env
:
BASEMENT_BROADCAST_DRIVER =soketi
BROADCAST_DRIVER =pusher
PUSHER_APP_ID =app-id
PUSHER_APP_KEY =app-key
PUSHER_APP_SECRET =app-secret
PUSHER_HOST =127.0.0.1
PUSHER_PORT =6001
PUSHER_SCHEME =http
然后,当您想在应用程序中使用聊天功能时,请使用以下命令保持 Soketi 服务器运行:
npx soketi start
与 Soketi 类似,您需要先配置.env
,配置如下:
BASEMENT_BROADCAST_DRIVER =laravel-websockets
BROADCAST_DRIVER =pusher
PUSHER_APP_ID =app-id
PUSHER_APP_KEY =app-key
PUSHER_APP_SECRET =app-secret
PUSHER_HOST =127.0.0.1
PUSHER_PORT =6001
PUSHER_SCHEME =http
然后,当您想在应用程序中使用聊天功能时,请使用以下命令保持 Laravel Websockets 服务器运行:
php artisan websockets:serve
配置您的 Sanctum 有状态域
由于此包使用 Laravel Sanctum 作为主要身份验证系统,因此您需要配置.env
以使用与您当前使用的域等效的SANCTUM_STATEFUL_DOMAINS
:
SANCTUM_STATEFUL_DOMAINS=<your-app-domain>
示例:
basement.up.railway.app
,127.0.0.1:8080
为您的用户模型实现basement chat功能
在您的用户模型中(默认情况下使用app/Models/User.php
),对其进行修改,使其实现BasementChatBasementContractsUser
并使用BasementChatBasementTraitsHasPrivateMessages
特征
<?php
namespace AppModels;
+ use BasementChatBasementContractsUser as BasementUserContract;
+ use BasementChatBasementTraitsHasPrivateMessages;
...
- class User extends Authenticatable
+ class User extends Authenticatable implements BasementUserContract
{
+ use HasPrivateMessages;
...
}
将basement chat组件加载到您的视图中
要添加聊天框组件,请将其加载到用户已登录的.blade
视图文件中。例如,如果您使用 Laravel Breeze,则路径应位于resources/views/layouts/app.blade.php
中。然后,在结束</body>
标记之前添加<x-basement::chat-box />
行。
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
...
+ <x-basement::chat-box />
</body>
</html>
选择如何使用前端资源
有两种方法可以使用此包的前端资源。您可以使用以下其中一项:
link
和script
标签使用预捆绑的资源这是将basement chat前端资产与现有 Laravel 应用程序集成的最简单方法。请注意,此捆绑包还将以下包设置为您的全局window
对象:
window.Alpine
window.axios
window.Pusher
window.Echo
在与上一步添加聊天框组件的同一文件中,您需要加载basement chat .css
和.js
文件:
<!DOCTYPE html>
<html lang="en">
<head>
...
+ <link rel="stylesheet" href="{{ asset('vendor/basement/basement.bundle.min.css') }}">
</head>
<body>
...
<x-basement::chat-box />
+ <script src="{{ asset('vendor/basement/basement.bundle.min.js') }}"></script>
</body>
</html>
您还可以将basement chat库作为模块导入到您自己的.js
文件中并自行捆绑。
首先,确保将以下包分配给全局window
对象:
alpinejs@^3
与@alpinejs/intersect@^3
插件作为window.Alpine
axios@^1
作为window.axios
laravel-echo@^1
作为window.Echo
pusher-js@^7
作为window.Pusher
要自动安装上述依赖项,可以使用以下命令:
php artisan basement:install frontend_deps
然后,您需要导入以下模块:
vendor/basement-chat/basement-chat/dist/basement.bundle.min.css
vendor/basement-chat/basement-chat/dist/basement.plugin.esm
作为 Alpine.js 插件vendor/basement-chat/basement-chat/dist/basement.echo-options.esm
作为 Laravel Echo 参数如果您使用 cjs 模块而不是 esm,则可以将
.esm
后缀更改为.common
。
resources/js/app.js
中的完整工作示例如下所示:
import '../../vendor/basement-chat/basement-chat/dist/basement.bundle.min.css'
import axios from 'axios'
import Pusher from 'pusher-js'
import Echo from 'laravel-echo'
import Alpine from 'alpinejs'
import intersect from '@alpinejs/intersect'
import echoOptions from '../../vendor/basement-chat/basement-chat/dist/basement.echo-options.esm'
import basement from '../../vendor/basement-chat/basement-chat/dist/basement.plugin.esm'
window . axios = axios
window . Pusher = Pusher
window . Echo = new Echo ( echoOptions )
window . Alpine = Alpine
window . Alpine . plugin ( intersect )
window . Alpine . plugin ( basement )
window . Alpine . start ( )
该包发布了config/basement.php
配置文件,并提供了配置broadcaster
、 chat_box_widget_position
、 user_model
、 avatar
和middleware
的选项。有关可配置内容的更多详细信息,请参阅此文件。
除了通过config/basement.php
文件进行配置之外,您还可以通过更改类实现或覆盖默认方法来进一步自定义。让我们探讨一下可以使用此功能执行的一些用例:
默认情况下, basement chat包将在您的联系人列表中显示用户的全名。如果您想显示姓氏,则可以重写getNameAttribute
,如下例所示:
<?php
namespace App Models ;
use BasementChat Basement Contracts User as BasementUserContract ;
use BasementChat Basement Traits HasPrivateMessages ;
class User extends Authenticatable implements BasementUserContract
{
use HasPrivateMessages;
. . .
/**
* Get the user's last name instead of the user's full name.
*/
public function getNameAttribute(): string
{
return str ( $ this -> attributes [ ' name ' ])-> explode ( ' ' )-> last ();
}
}
就像您更改联系人中显示的姓名一样。您还可以覆盖默认的getAvatarAttribute
来更改联系人的头像。
<?php
namespace App Models ;
use BasementChat Basement Contracts User as BasementUserContract ;
use BasementChat Basement Traits HasPrivateMessages ;
class User extends Authenticatable implements BasementUserContract
{
use HasPrivateMessages;
. . .
/**
* Get the user's avatar url.
*/
public function getAvatarAttribute(): string
{
return $ this -> attributes [ ' image_url ' ];
}
}
您还可以有条件地向特定用户提供聊天功能,而不是向所有可用用户提供聊天功能。例如,如果您正在使用 spatie/laravel-permission 并希望仅为administrator
角色提供聊天功能:
// app/Actions/AllContacts.php
<?php
namespace App Actions ;
use App Models User ;
use BasementChat Basement Actions AllContacts as BasementAllContactsAction ;
use BasementChat Basement Data ContactData ;
use Illuminate Contracts Auth Authenticatable ;
use Illuminate Database Eloquent Builder as EloquentBuilder ;
use Illuminate Database Eloquent Collection as EloquentCollection ;
use Illuminate Support Collection ;
class AllContacts extends BasementAllContactsAction
{
/**
* Extend and override the default method for getting all contacts.
* Only users with the administrator role will appear in the contact list.
*/
public function all ( Authenticatable $ user ): Collection
{
/** @var EloquentCollection<int,User> $contacts */
$ contacts = User:: addSelectLastPrivateMessageId ( $ user )
-> addSelectUnreadMessages ( $ user )
-> whereHas ( ' roles ' , function ( EloquentBuilder $ query ): void {
$ query -> where ( ' name ' , ' administrator ' );
})
-> get ();
$ contacts -> append ( ' avatar ' );
$ contacts -> load ( ' lastPrivateMessage ' );
return $ contacts
-> sortByDesc ( ' lastPrivateMessage.id ' )
-> values ()
-> map ( fn ( Authenticatable $ contact ): ContactData => $ this -> convertToContactData ( $ contact ));
}
}
// app/Providers/AppServiceProvider.php
<?php
namespace App Providers ;
use App Actions AllContacts ;
use BasementChat Basement Basement ;
use Illuminate Support ServiceProvider ;
class AppServiceProvider extends ServiceProvider
{
...
/**
* Bootstrap any application services.
*/
public function boot (): void
{
// Override the default action with your customized AllContacts action.
Basement:: allContactsUsing (AllContacts::class);
}
}
以下是可用于覆盖其他操作和模型的函数列表:
Basement:: useUserModel (User::class); Basement:: usePrivateMessageModel (PrivateMessage::class); PrivateMessage:: observe (PrivateMessageObserver::class); Basement:: allContactsUsing (AllContacts::class); Basement:: allPrivateMessagesUsing (AllPrivateMessages::class); Basement:: markPrivateMessagesAsReadUsing (MarkPrivatesMessagesAsRead::class); Basement:: sendPrivateMessagesUsing (SendPrivateMessage::class);
<!-- resources/views/layouts/app.blade.php -->
<!DOCTYPE html >
< html lang =" en " >
< head >
...
</ head >
< body >
...
<!-- The chat box component button will only be available if the current user is an administrator -->
@role('administrator')
< x-basement::chat-box />
@endrole
</ body >
</ html >
还可以自定义视图样式。例如,您可以执行以下步骤来更改聊天框组件的标题和图标的颜色:
使用以下命令发布视图:
php artisan vendor:publish --tag=basement-views
打开resources/views/vendor/basement/components/organisms/header.blade.php
文件,然后添加 style 属性,如下所示:
<header {{ $attributes->merge([
'class' => 'bm-grid bm-grid-cols-5 bm-border-b bm-border-gray-300 bm-p-3 bm-bg-blue-500 bm-text-white bm-rounded-t-md',
+ 'style' => 'background-color: cornflowerblue;',
]) }}>
...
</header>
打开resources/views/vendor/basement/chat-box.blade.php
文件,添加文本颜色样式:
<div class="basement">
<div ...>
<button
+ style="color: cornflowerblue"
x-on:click="isMinimized = false"
x-bind:class="isMinimized === true ? '' : 'bm-hidden'"
x-bind:data-title="totalUnreadMessages === 0 ? 'Open chat box' : `There are ${totalUnreadMessages} unread messages`"
class="basement-chat-box__open-button bm-w-full bm-h-full bm-rounded-full bm-text-blue-500 bm-border bm-bg-white bm-transition bm-duration-500 hover:bm-text-white hover:bm-bg-blue-500 bm-shadow-lg">
...
</button>
...
</div>
</div>
当您使用预先捆绑的资源时。每次使用composer update
更新此包后,您都需要使用以下命令使资产文件保持最新:
php artisan vendor:publish --tag=basement-assets --force
或者,要在执行update
命令后自动运行上述命令,您可以通过将composer.json
添加到post-update-cmd
脚本中来配置它:
"scripts": {
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force",
+ "@php artisan vendor:publish --tag=basement-assets --ansi --force"
]
},
当您使用 Vite 开发服务器并获得非常高的内存使用率时,您可以配置vite.config.js
以忽略监视供应商文件夹,如下例所示:
import { defineConfig } from 'vite'
import laravel from 'laravel-vite-plugin'
export default defineConfig({
+ server: {
+ watch: {
+ ignored: [
+ './vendor/**',
+ ],
+ },
+ },
});
当您使用php artisan route:cache
命令时, basement chat包可能无法启动,并且在浏览器控制台中访问broadcasting/auth
端点时,您可能会收到 403 Forbidden - HTTP 错误。该问题的解决方案仍在进一步研究中,建议您此时不要使用路由缓存功能。
请访问以下页面查看basement chat路线图。
您可以在下一页查看有关贡献指南的详细信息。
basement chat包已获得 MIT 许可。