PHPackages                             chequite/chat - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. chequite/chat

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

chequite/chat
=============

Пакет для чата на центрифуге

1.0.0(2y ago)111MITPHP

Since Jan 22Pushed 2y ago1 watchersCompare

[ Source](https://github.com/ycunyci1/chat-package)[ Packagist](https://packagist.org/packages/chequite/chat)[ RSS](/packages/chequite-chat/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (3)Versions (2)Used By (0)

Документация Laravel Чат-Пакета
===============================

[](#документация-laravel-чат-пакета)

Оглавление
----------

[](#оглавление)

1. Введение
2. Зависимости
3. Установка
4. Настройка
5. Важные моменты
6. API Методы
7. Websockets
8. События и слушатели для кастомизации и доработки серверной части

1. Введение
-----------

[](#1-введение)

Пакет для быстрой установки чата в laravel проект.

2. Зависимости
--------------

[](#2-зависимости)

laravel/framework: ^10.0
laravel/passport: ^11.0.0
lcobucci/jwt: ^5.0.0

3. Установка
------------

[](#3-установка)

composer require chequite/chat

4. Настройка
------------

[](#4-настройка)

Первым делом необходимо развернуть centrifugo. Очень удобно разворачивать через докер:

1. Подтягиваем себе образ centrifugo: `docker pull centrifugo/centrifugo `
2. Создаем папку для конфигурационного файла `mkdir /var/centrifugo`
3. Создаем файл конфигурации `nano /var/centrifugo/config.json`
4. В файл записываем настройки. Для дефолтного использования конфиг будет выглядеть так: {
    "allow\_subscribe\_for\_client": true,
    "api\_key": "5af3d597bd452745a937c0ffda270fab060419e27s93f61d4f48e3409015df9ece",
    "token\_hmac\_secret\_key": "8b1482f10d8d47ac838549c8eac07edf3077a00ac6f6886fd5434f896c401cfb8e",
    "admin": true,
    "admin\_password": "MoskowCityB@c9",
    "admin\_secret": "3fb95b5b93dad7269b7275c525726e86f47e123f1df1158770bfdc27a2fbab1e",
    "allowed\_origins": \["http://localhost"\]
    }
    allow\_subscribe\_for\_client - Разрешаем подписку на каналы
    api\_key - ключ для апи запросов, сгенерируйте рандомную строку и вставьте сюда
    token\_hmac\_secret\_key - секретный ключ для приложения, тоже генерируется рандомная строка
    admin - включаем админ панель для дебага и отслеживания работы центрифуги
    admin\_password - пароль для входа в админ панель
    admin\_secret - ключ для запросов под админом
    allowed\_origins - Разрешенные домены. Необходимо указать все домены с которых будут отправляться запросы. Если не укажете, то будете получать ошибку 403.
5. Поднимаем контейнер `docker run -v /var/centrifugo/config.json:/centrifugo/config.json -p 8000:8000 centrifugo/centrifugo centrifugo -c config.json`
6. После того как установили пакет и подняли центрифугу, надо добавить в .env файле ключи:
    CENTRIFUGO\_URL - url вашего centrifugo сервера (Пример , может быть и именованный домен)
    CENTRIFUGO\_API\_KEY - api key, который вы указали в конфиге на сервере centrifugo (Пример 5af3d5s97bd452745a937c0fda270fab060419e2793af61d4f48e3409015df)
    CENTRIFUGO\_SECRET= секретный ключ, который вы также указали в конфиге на сервере centrifugo (Пример 8b1a482f10d8d47ac83s8549c8e07edf3077a00ac6f6886fd5434f896c401cf)
7. Запускаем миграции для пакета после установки: `php artisan migrate`
8. Создаем символьную ссылку на папку storage: `php artisan storage:link`

Официальная документация:

5. Важные моменты
-----------------

[](#5-важные-моменты)

### 1. При регистрации и логине нужно генерировать токен на сервере и возвращать клиенту.

[](#1-при-регистрации-и-логине-нужно-генерировать-токен-на-сервере-и-возвращать-клиенту)

`JwtService::generateJwt($user->id)` - сгенерирует нужный токен

### 2. Сообщение автоматически ставится прочитанным:

[](#2-сообщение-автоматически-ставится-прочитанным)

- Когда пользователь открыл чат
- Когда пользователь отправил сообщение

Как читать сообщения при открытом диалоге нужно думать на клиенте, эндпоинт есть ниже

### 3. Токен центрифуги живет час. Необходимо обновлять его в этом интервале. Я обновлял его при каждой перезагрузке страницы, т.к не силен в клиентской части

[](#3-токен-центрифуги-живет-час-необходимо-обновлять-его-в-этом-интервале-я-обновлял-его-при-каждой-перезагрузке-страницы-тк-не-силен-в-клиентской-части)

6. Api методы
-------------

[](#6-api-методы)

### 1. Получить информацию о текущем пользователе

[](#1-получить-информацию-о-текущем-пользователе)

- **Endpoint**: `/api/get-user-info`
- **Method**: `GET`

#### Пример ответа

[](#пример-ответа)

```
{
  "id": 1,
  "avatar": "https://your-domain.ru/path/to/file",
  "name": "Петр Петров"
}
```

#### Описание полей ответа:

[](#описание-полей-ответа)

ParameterTypeDescription`id`integerID текущего пользователя`name`stringИмя текущего пользователя`avatar`stringАватар текущего пользователя### 2. Получить список чатов

[](#2-получить-список-чатов)

- **Endpoint**: `/api/chats`
- **Method**: `GET`

#### Описание

[](#описание)

Получить список чатов для текущего пользователя

#### Пример ответа

[](#пример-ответа-1)

```
{
  "id": 137,
  "companion_name": "Михаил Михайлов",
  "avatar": "https://your-domain.ru/path/to/file",
  "last_message": {
    "text": "Текст сообщения",
    "timestamp": "15:33",
    "sender_id": 9,
    "sender_name": "Сергей Сергеев",
    "was_read": true
  }
}
```

#### Описание полей ответа:

[](#описание-полей-ответа-1)

ParameterTypeDescription`id`integerID собеседника`companion_name`stringИмя собеседника`avatar`stringАватар собеседника`last_message`object/nullИнформация о последнем сообщении в чате`last_message.text`stringТекст последнего сообщения`last_message.timestamp`stringВремя отправки последнего сообщения`last_message.sender_id`integerID отправителя`last_message.was_read`booleanСообщение было прочитано### 3. Создать чат

[](#3-создать-чат)

- **Endpoint**: `/api/chats`
- **Method**: `POST`

#### Описание

[](#описание-1)

Создать чат для текущего пользователя с выбранным пользователем

#### Обязательные параметры:

[](#обязательные-параметры)

ParameterTypeDescription`companionId`integerID пользователя с которым создаем чат#### Пример ответа

[](#пример-ответа-2)

```
{
  "chatId": 138
}
```

#### Описание полей ответа:

[](#описание-полей-ответа-2)

ParameterTypeDescription`chatId`integerID созданного чата### 3. Получить сообщения чата

[](#3-получить-сообщения-чата)

- **Endpoint**: `/api/chats/{chatId}/messages`
- **Method**: `GET`

#### Параметры url:

[](#параметры-url)

ParameterTypeDescription`chatId`integerID чата#### Пример ответа

[](#пример-ответа-3)

```
{
  "chatId": 138,
  "messages": {
     {
        "text": "Привет",
        "was_read": true,
        "timestamp": "16:53",
        "user": {
          "id": 3,
          "email": "user@gmail.com",
          "avatar": "https://your-domain.ru/path/to/file",
          "is_online": false,
          "name": "Алексей Алексеев",
          "last_seen_at": "24.01.2024 15:30"
        },
     }
  },
  "companion": {
      "id": 3,
      "email": "user@gmail.com",
      "avatar": "https://your-domain.ru/path/to/file",
      "is_online": false,
      "name": "Алексей Алексеев",
      "last_seen_at": "24.01.2024 15:30",
  }
}
```

#### Описание полей ответа:

[](#описание-полей-ответа-3)

ParameterTypeDescription`chatId`integerID чата`messages`objectСписок сообщений`messages.*`objectИнформация о сообщении`messages.*.text`stringТекст сообщения`messages.*.was_read`stringСообщение было прочитано`messages.*.timestamp`stringДата отправки сообщения`messages.*.user`objectИнформация об отправителе сообщения`messages.*.user.id`integerID отправителя`messages.*.user.email`stringEmail отправителя`messages.*.user.avatar`stringАватар отправителя`messages.*.user.is_online`booleanСтатус отправителя`messages.*.user.name`stringИмя отправителя`messages.*.user.last_seen_at`stringДата последнего входа(если не онлайн)`companion`objectИнформация о собеседнике`companion.id`integerID собеседника`companion.email`stringEmail собеседника`companion.avatar`stringАватар собеседника`companion.is_online`booleanСтатус собеседника`companion.name`stringИмя собеседника`companion.last_seen_at`stringДата последнего входа(если не онлайн)### 4. Отправить сообщение

[](#4-отправить-сообщение)

- **Endpoint**: `/api/chats/{chatId}/messages`
- **Method**: `POST`

#### Параметры url:

[](#параметры-url-1)

ParameterTypeDescription`chatId`integerID чата#### Пример ответа

[](#пример-ответа-4)

```
{
   "text": "Hello world!",
   "user": {
      "id": 5,
      "email": "email@gmail.com",
      "avatar": "https://your-domain.ru/path/to/file",
      "is_online": false,
      "name": "Александр Александров",
      "last_seen_at": "25.01.2024 10:15"
   },
   "was_read": true,
   "timestamp": "11:30"
}
```

#### Описание полей ответа:

[](#описание-полей-ответа-4)

ParameterTypeDescription`text`stringТекст сообщения`user`objectИнформация об отправителе`user.id`integerID отправителя`user.email`stringEmail отправителя`user.avatar`stringAvatar отправителя`user.is_online`booleanСтатус отправителя`user.name`stringИмя отправителя`was_read`booleanБыло прочитано`timestamp`stringДата отправки### 5. Сообщить о том, что пользователь печатает

[](#5-сообщить-о-том-что-пользователь-печатает)

- **Endpoint**: `/api/typing`
- **Method**: `POST`

#### Обязательные параметры:

[](#обязательные-параметры-1)

ParameterTypeDescription`chatId`integerID чата в котором текущий пользователь начал или закончил печатать`typing`booleantrue - начал печатать, false - закончил печатать#### Пример ответа

[](#пример-ответа-5)

```
{
}
```

#### Параметры ответа

[](#параметры-ответа)

Пустой объект

### 6. Поиск пользователя

[](#6-поиск-пользователя)

- **Endpoint**: `/api/search-users`
- **Method**: `GET`

#### Обязательные GET параметры

[](#обязательные-get-параметры)

ParameterTypeDescription`search`stringТекст поиска (имя или фамилия)#### Пример ответа

[](#пример-ответа-6)

```
{
   {
      "id": 3,
      "email": "email@gmail.com",
      "avatar": "https://your-domain.ru/path/to/file",
      "is_online": false,
      "name": "Филип Филипов",
      "last_seen_at": "24.01.2024 19:17"
   },
   {
      "id": 157,
      "email": "email2@gmail.com",
      "avatar": "https://your-domain.ru/path/to/file",
      "is_online": true,
      "name": "Филип Сергеев",
      "last_seen_at": null
   }
}
```

#### Описание полей ответа:

[](#описание-полей-ответа-5)

ParameterTypeDescription`*`objectИнформация о найденном пользователе`*.id`integerID пользователя`*.email`stringE-mail пользователя`*.avatar`stringАватар пользователя`*.is_online`booleanСтатус пользователя`*.name`stringИмя пользователя`*.last_seen_at`stringДата последнего входа (если не онлайн)#### 7. Обновить centrifugo token

[](#7-обновить-centrifugo-token)

- **Endpoint**: `/api/update-centrifugo-token`
- **Method**: `GET`

#### Пример ответа

[](#пример-ответа-7)

```
{
   "centrifugo_token": "ass2jajdwk2kasdkaskgkbkbggb5ib5o412kf2occe3"
}
```

#### 8. Сообщить, что пользователь прочитал сообщение

[](#8-сообщить-что-пользователь-прочитал-сообщение)

- **Endpoint**: `/api/chats/{chatId}/messages/{messageId}`
- **Method**: `POST`

#### Описание

[](#описание-2)

Запрос нужен для того, чтобы когда пользователь находится чате и ему приходит сообщение, то надо сообщить серверу, что прочитано

#### Url параметры

[](#url-параметры)

ParameterTypeDescription`chatId`integerID чата в котором делаем сообщение прочитанным`messageId`integerID сообщения которое делаем прочитанным#### Пример ответа

[](#пример-ответа-8)

```
{
}
```

#### Параметры ответа

[](#параметры-ответа-1)

Пустой объект

7. Websockets
-------------

[](#7-websockets)

Для работы на клиенте с вебсокетами я использовал пакет центрифуги: . По документации легко разобраться. Единственный момент. Нужно передавать centrifuge token при подписках на каналы.

### 1. Прослушивание обновления списка чатов

[](#1-прослушивание-обновления-списка-чатов)

- **Channel name**: `user-{userId}-chats`

#### Данные, которые приходят в канал

[](#данные-которые-приходят-в-канал)

ParameterTypeDescription`id`integerID собеседника`companion_name`stringИмя собеседника`avatar`stringАватар собеседника`last_message`object/nullИнформация о последнем сообщении в чате`last_message.text`stringТекст последнего сообщения`last_message.timestamp`stringВремя отправки последнего сообщения (Формат 15:45)`last_message.sender_id`integerID отправителя`last_message.was_read`booleanСообщение было прочитано### 2. Прослушивание обновления сообщений в чате

[](#2-прослушивание-обновления-сообщений-в-чате)

- **Channel name**: `user-{chatId}-messages`

#### Данные, которые приходят в канал

[](#данные-которые-приходят-в-канал-1)

ParameterTypeDescription`text`stringТекст сообщения`user`objectИнформация об отправителе`user.id`integerID отправителя`user.email`stringEmail отправителя`user.avatar`stringAvatar отправителя`user.is_online`booleanСтатус отправителя`user.name`stringИмя отправителя`was_read`booleanБыло прочитано`timestamp`stringДата отправки### 3. Прослушивание обновления статуса собеседника (online, offline)

[](#3-прослушивание-обновления-статуса-собеседника-online-offline)

- **Channel name**: `user-{userId}-status`

#### Данные, которые приходят в канал

[](#данные-которые-приходят-в-канал-2)

ParameterTypeDescription`isOnline`booleantrue - онлайн, false - offline`userId`integerID пользователя, у которого изменился статус`lastSeen`stringНужно для того, чтобы показывать когда пользователь был последний раз, если isOnline = false### 4. Прослушивания события набора сообщения

[](#4-прослушивания-события-набора-сообщения)

- **Channel name**: `chat.{chatId}`

#### Данные, которые приходят в канал

[](#данные-которые-приходят-в-канал-3)

ParameterTypeDescription`chatId`integerID чата`userId`integerID пользователя, который печатает`typing`booleantrue - печатает, false - перестал печатать### 5. Пример того, как я на клиенте подписывался на канал обновления сообщений в чате

[](#5-пример-того-как-я-на-клиенте-подписывался-на-канал-обновления-сообщений-в-чате)

```
const sub = this.centrifuge.newSubscription(`user-${chatId}-messages`);

sub.on('publication', (response) => {
    this.currentChat.messages.push(JSON.parse(response.data))
    this.scrollToBottom();
});

sub.subscribe()
```

8. События и слушатели для кастомизации и доработки серверной части
-------------------------------------------------------------------

[](#8-события-и-слушатели-для-кастомизации-и-доработки-серверной-части)

- Ивент обновления чата Dd1\\Chat\\Events\\ChatsUpdated
- Ивент отправки сообщения/обновления текущего чата Dd1\\Chat\\Events\\MessageSent
- Ивент набора сообщения Dd1\\Chat\\Events\\TypingEvent
- Ивент обновления статуса online/offline Dd1\\Chat\\Events\\UserStatusUpdatedEvent

#### Если необходимо создать новый канал для прослушивания нового события, то просто нужно создать Event и забиндить слушателя Dd1\\Chat\\Listeners\\CentrifugoPushToChannel в ServiceProvider. Слушатель ожидает всегда 2 поля в construct:

[](#если-необходимо-создать-новый-канал-для-прослушивания-нового-события-то-просто-нужно-создать-event-и-забиндить-слушателя-dd1chatlistenerscentrifugopushtochannel-в-serviceprovider-слушатель-ожидает-всегда-2-поля-в-construct)

ParameterTypeDescription`channel`stringНазвание канала`data`arrayМассив с данными, которые будут отправляться по websocket каналу

###  Health Score

21

—

LowBetter than 18% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity7

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

893d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/85c6e953d71496c20d90274b3b53a1c67fbee988b2ab20d72dbbfaf529453875?d=identicon)[chequite](/maintainers/chequite)

---

Top Contributors

[![ycunyci1](https://avatars.githubusercontent.com/u/90024293?v=4)](https://github.com/ycunyci1 "ycunyci1 (17 commits)")

### Embed Badge

![Health badge](/badges/chequite-chat/health.svg)

```
[![Health](https://phpackages.com/badges/chequite-chat/health.svg)](https://phpackages.com/packages/chequite-chat)
```

###  Alternatives

[grumpydictator/firefly-iii

Firefly III: a personal finances manager.

23.9k69.5k](/packages/grumpydictator-firefly-iii)[unopim/unopim

UnoPim Laravel PIM

10.5k2.4k](/packages/unopim-unopim)[jeremy379/laravel-openid-connect

OpenID Connect support to the PHP League's OAuth2 Server. Compatible with Laravel Passport.

59437.0k9](/packages/jeremy379-laravel-openid-connect)[exceedone/exment

Management for Product, Client, Contracts, Subscription, ...

28038.8k](/packages/exceedone-exment)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
