PHPackages                             iperson1337/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. [Framework](/categories/framework)
4. /
5. iperson1337/chat

ActiveLibrary[Framework](/categories/framework)

iperson1337/chat
================

Chat Package for Laravel

18941PHP

Since Oct 2Pushed 4y ago1 watchersCompare

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

READMEChangelogDependenciesVersions (2)Used By (0)

[![chat](menu.png)](menu.png)

[![Build Status](https://camo.githubusercontent.com/c9e7c96456e124fb266d352122bcfc2a7d3cdf364d6ec3f627681ccab345f322/68747470733a2f2f7472617669732d63692e6f72672f69706572736f6e313333372f636861742e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/iperson1337/chat)[![Downloads](https://camo.githubusercontent.com/782a390ed65925503f10ffaf759f66f99f036ffb2315956c9fa424bb98ecdc48/68747470733a2f2f706f7365722e707567782e6f72672f69706572736f6e313333372f636861742f642f746f74616c2e737667)](https://packagist.org/packages/iperson1337/chat)[![Packagist](https://camo.githubusercontent.com/d9326dd7df679c14d712bdfe2972e27ef58baf74e1fc918f1eaf54e3a59128c1/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f69706572736f6e313333372f636861742e737667)](https://packagist.org/packages/iperson1337/chat)[![](https://camo.githubusercontent.com/5359a106d1bdcf9fe3dd725e7ece949721c1b53c82a997fe6e8d7ce5375c5346/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f38356631353265616532613034623235373833642f6d61696e7461696e6162696c697479)](https://codeclimate.com/github/iperson1337/chat/maintainability)

Chat
----

[](#chat)

Create a Chat application for your multiple Models

Table of Contents
-----------------

[](#table-of-contents)

Click to expand- [Introduction](#introduction)
- [Installation](#installation)
- [Usage](#usage)
    - [Adding the ability to participate to a Model](#Adding-the-ability-to-participate-to-a-Model)
    - [Get participant details](#get-participant-details)
    - [Creating a conversation](#creating-a-conversation)
    - [Get a conversation by Id](#get-a-conversation-by-id)
    - [Update conversation details](#update-conversation-details)
    - [Send a text message](#send-a-text-message)
    - [Send a message of custom type](#send-a-message-of-custom-type)
    - [Get a message by id](#get-a-message-by-id)
    - [Get message sender](#Get-message-sender)
    - [Mark a message as read](#mark-a-message-as-read)
    - [Mark whole conversation as read](#mark-whole-conversation-as-read)
    - [Unread messages count](#unread-messages-count)
    - [Delete a message](#delete-a-message)
    - [Cleanup Deleted Messages](#cleanup-deleted-messages)
    - [Clear a conversation](#clear-a-conversation)
    - [Get participant conversations](#Get-participant-conversations)
    - [Get a conversation between two participants](#get-a-conversation-between-two-participants)
    - [Get common conversations among participants](#get-common-conversations-among-participants)
    - [Remove participants from a conversation](#remove-participants-from-a-conversation)
    - [Add participants to a conversation](#add-participants-to-a-conversation)
    - [Get messages in a conversation](#get-messages-in-a-conversation)
    - [Get recent messages](#get-recent-messages)
    - [Get participants in a conversation](#get-participants-in-a-conversation)
    - [Get participation entry for a Model in a conversation](#Get-participation-entry-for-a-Model-in-a-conversation)
    - [Update participation settings](#Update-participation-settings)
    - [Data Transformers](#Data-Transformers)
- [License](#license)

Checkout a simple [Original rep](https://github.com/musonza/chat)Checkout a simple [Demo Application](https://github.com/musonza/chat-demo)

Introduction
------------

[](#introduction)

This package allows you to add a chat system to your Laravel ^5.4 application

Installation
------------

[](#installation)

From the command line, run:

```
composer require iperson1337/chat

```

Publish the assets:

```
php artisan vendor:publish

```

This will publish database migrations and a configuration file `iperson1337_chat.php` in the Laravel config folder.

Configuration
-------------

[](#configuration)

See `iperson1337_chat.php` for configuration

Run the migrations:

```
php artisan migrate

```

Usage
-----

[](#usage)

You can mix Models as participants. For instance you can have `Parents`, `Students` and `Professors` models communicating

#### Adding the ability to participate to a Model

[](#adding-the-ability-to-participate-to-a-model)

Add the `Iperson1337\Chat\Traits\Messageable` trait to any Model you want to participate in Conversations For example, let's say we want out `Bot` model to chat with other Models:

```
use Illuminate\Database\Eloquent\Model;
use Iperson1337\Chat\Traits\Messageable;

class Bot extends Model
{
    use Messageable;
}
```

#### Get participant details

[](#get-participant-details)

Since we allow Models with data that differ in structure to chat, we may want a uniform way to represent the participant details in a uniform way.

You can get the details as follows:

```
$participantModel->getParticipantDetails();
```

Assuming you have a column `name` for your model, this returns a default array `['name' => 'column_value']`You can however, customize this for your needs by adding an Eloquent Accessor that returns an array with as much as you need to your model as follows:

```
    public function getParticipantDetailsAttribute()
    {
        return [
            'name' => $this->someValue,
            'foo' => 'bar',
        ];
    }
```

#### Creating a conversation

[](#creating-a-conversation)

You can start a conversation by passing an array of Models as participants

```
$participants = [$model1, $model2,..., $modelN];

$conversation = Chat::createConversation($participants);
```

#### Creating a conversation of type private / public

[](#creating-a-conversation-of-type-private--public)

You may want to classify conversations as private or public

```
$participants = [$model1, $model2,..., $modelN];

// Create a private conversation
$conversation = Chat::createConversation($participants)->makePrivate();

// Create a public conversation
$conversation = Chat::createConversation($participants)->makePrivate(false);

// Create a direct message

// Make direct conversation after creation
$conversation = Chat::createConversation($participants)->makeDirect();

// Specify intent for direct conversation before creation
$conversation = Chat::makeDirect()->createConversation($participants);
```

> **Note:** You will not be able to add additional participants to a direct conversation. Additionally you can't remove a participant from a direct conversation.

#### Get a conversation by id

[](#get-a-conversation-by-id)

```
$conversation = Chat::conversations()->getById($id);
```

#### Update conversation details

[](#update-conversation-details)

```
$data = ['title' => 'PHP Channel', 'description' => 'PHP Channel Description'];
$conversation->update(['data' => $data]);
```

#### Send a text message

[](#send-a-text-message)

```
$message = Chat::message('Hello')
            ->from($model)
            ->to($conversation)
            ->send();
```

#### Send a message of custom type

[](#send-a-message-of-custom-type)

The default message type is `text`. If you want to specify custom type you can call the `type()` function as below:

```
$message = Chat::message('http://example.com/img')
		->type('image')
		->from($model)
		->to($conversation)
		->send();
```

### Get a message by id

[](#get-a-message-by-id)

```
$message = Chat::messages()->getById($id);
```

### Get message sender

[](#get-message-sender)

```
$sendModel = $message->sender;
```

#### Mark a message as read

[](#mark-a-message-as-read)

```
Chat::message($message)->setParticipant($participantModel)->markRead();
```

#### Flag / mark a message

[](#flag--mark-a-message)

```
Chat::message($message)->setParticipant($participantModel)->toggleFlag();

Chat::message($message)->setParticipant($participantModel)->flagged(); // true
```

#### Mark whole conversation as read

[](#mark-whole-conversation-as-read)

```
Chat::conversation($conversation)->setParticipant($participantModel)->readAll();
```

#### Unread messages count

[](#unread-messages-count)

```
$unreadCount = Chat::messages()->setParticipant($participantModel)->unreadCount();
```

#### Unread messages count per Conversation

[](#unread-messages-count-per-conversation)

```
Chat::conversation($conversation)->setParticipant($participantModel)->unreadCount();
```

#### Delete a message

[](#delete-a-message)

```
Chat::message($message)->setParticipant($participantModel)->delete();
```

#### Cleanup Deleted Messages

[](#cleanup-deleted-messages)

What to cleanup when all participants have deleted a `$message` or `$conversation`?

Listen for `\Iperson1337\Chat\Eventing\AllParticipantsDeletedMessage` and

`\Iperson1337\Chat\Eventing\AllParticipantsClearedConversation`

#### Clear a conversation

[](#clear-a-conversation)

```
Chat::conversation($conversation)->setParticipant($participantModel)->clear();
```

#### Get participant conversations

[](#get-participant-conversations)

```
Chat::conversations()->setPaginationParams(['sorting' => 'desc'])
	->setParticipant($participantModel)
	->limit(1)
	->page(1)
	->get();
```

#### Get a conversation between two participants

[](#get-a-conversation-between-two-participants)

```
$conversation = Chat::conversations()->between($participantModel1, $participantModel2);
```

#### Get common conversations among participants

[](#get-common-conversations-among-participants)

```
$conversations = Chat::conversations()->common($participants);
```

`$participants` is an array of participant Models

#### Remove participants from a conversation

[](#remove-participants-from-a-conversation)

```
/* removing one user */
Chat::conversation($conversation)->removeParticipants([$participantModel]);
```

```
/* removing multiple participants */
Chat::conversation($conversation)->removeParticipants([$participantModel, $participantModel2,...,$participantModelN]);
```

#### Add participants to a conversation

[](#add-participants-to-a-conversation)

```
/* add one user */
Chat::conversation($conversation)->addParticipants([$participantModel]);
```

```
/* add multiple participants */
Chat::conversation($conversation)->addParticipants([$participantModel, $participantModel2]);
```

#### Get messages in a conversation

[](#get-messages-in-a-conversation)

```
Chat::conversation($conversation)->setParticipant($participantModel)->getMessages()
```

#### Get user conversations by type

[](#get-user-conversations-by-type)

```
// private conversations
$conversations = Chat::conversations()->setParticipant($participantModel)->isPrivate()->get();

// public conversations
$conversations = Chat::conversations()->setParticipant($participantModel)->isPrivate(false)->get();

// direct conversations / messages
$conversations = Chat::conversations()->setParticipant($participantModel)->isDirect()->get();

// all conversations
$conversations = Chat::conversations()->setParticipant($participantModel)->get();
```

#### Get recent messages

[](#get-recent-messages)

```
$messages = Chat::conversations()->setParticipant($participantModel)->limit(25)->page(1)->get();
```

#### Pagination

[](#pagination)

There are a few ways you can achieve pagination You can specify the `limit` and `page` as above using the respective functions or as below:

```
   $paginated = Chat::conversations()->setParticipant($participant)
            ->setPaginationParams([
                'page' => 3,
                'perPage' => 10,
                'sorting' => "desc",
                'columns' => [
                    '*'
                ],
                'pageName' => 'test'
            ])
            ->get();

```

You don't have to specify all the parameters. If you leave the parameters out, default values will be used. `$paginated` above will return `Illuminate\Pagination\LengthAwarePaginator`To get the `conversations` simply call `$paginated->items()`

#### Get participants in a conversation

[](#get-participants-in-a-conversation)

```
$participants = $conversation->getParticipants();
```

#### Get participation entry for a Model in a conversation

[](#get-participation-entry-for-a-model-in-a-conversation)

```
Chat::conversation($conversation)->getParticipation($model);
```

#### Update participation settings

[](#update-participation-settings)

Set Conversation settings for participant (example: mute\_mentions, mute\_conversation)

```
$settings = ['mute_mentions' => true];

Chat::conversation($conversation)
    ->getParticipation($this->alpha)
    ->update(['settings' => $settings]);
```

#### Data Transformers

[](#data-transformers)

Need to have more control on the data returned from the package routes? You can specify your own Model transformers and take advantage of [Fractal](http://fractal.thephpleague.com/).

All you need to do is specify the location of your transformers in the configuration file `iperson1337_chat.php` as follows:

```
/**
 * Model Transformers
 */
'transformers' => [
    'conversation' => \MyApp\Transformers\ConversationTransformer::class,
    'message' => \MyApp\Transformers\MessageTransformer::class,
    'participant' => \MyApp\Transformers\ParticipantTransformer::class,
]
```

> **Note:** This only applies to responses from package routes.

License
-------

[](#license)

Chat is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)

###  Health Score

21

—

LowBetter than 18% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity16

Limited adoption so far

Community5

Small or concentrated contributor base

Maturity34

Early-stage or recently created project

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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/82be7ea66cb0be4216babdc575f36c6682c817e1ce296ed6e6d9c88657856ada?d=identicon)[iperson1337](/maintainers/iperson1337)

### Embed Badge

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

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

###  Alternatives

[laravel/dusk

Laravel Dusk provides simple end-to-end testing and browser automation.

1.9k39.6M299](/packages/laravel-dusk)[nineinchnick/edatatables

Grid widget for the Yii Framework, wrapper for the DataTables jQuery plugin

173.2k](/packages/nineinchnick-edatatables)[link-cloud/fast-hyperf

LinkCloud Fast Hyperf

241.2k1](/packages/link-cloud-fast-hyperf)

PHPackages © 2026

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