, (*1)
Messenger
Chat/Message system for Laravel 5.x., (*2)
With Messenger:, (*3)
- Users can send and receive messages.
- Users can participate in multiple conversations.
- Users can send messages to one or multiple users.
TL;DR
use Messenger;
// Sending a message to one user:
Messenger::from($user)->to($user)->message('Hey!');
// Sending a message to multiple users: (an array of user ids)
Messenger::from($user)->to([1,2,3,4])->message('Who want to chat?!');
// Sending a message to one thread: (perfect for replying to a specific thread!)
Messenger::from($user)->to($thread)->message('I\'ll be there');
Content
Installation
Requirements
Composer
$ composer require gerardojbaez/messenger
Service Provider and Facade
If you are using laravel 5.5 and later, you can skip the following two steps since this package supports package auto-discovery feature., (*4)
Add the package to your application service providers in config/app.php file., (*5)
'providers' => [
/**
* Third Party Service Providers...
*/
Gerardojbaez\Messenger\MessengerServiceProvider::class,
]
Add the Facade to your aliases array:, (*6)
'aliases' => [
[...]
'Messenger' => Gerardojbaez\Messenger\Facades\Messenger::class,
]
Config file and Migrations
Publish package config file and migrations with the command:, (*7)
$ php artisan vendor:publish --provider="Gerardojbaez\Messenger\MessengerServiceProvider"
Then run migrations:, (*8)
$ php artisan migrate
Traits and Contracts
Add Gerardojbaez/Messenger/Traits/Messageable trait and Gerardojbaez/Messenger/Contracts/MessageableInterface contract to your Users model., (*9)
See the following example:, (*10)
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Gerardojbaez\Messenger\Contracts\MessageableInterface;
use Gerardojbaez\Messenger\Traits\Messageable;
class User extends Authenticatable implements MessageableInterface
{
use Messageable;
Usage
Sending to One User
<?php
// Import the facade
use Messenger;
Messenger::from($user)->to($user2)->message('Hey!')->send();
Sending to Multiple Users
<?php
// Import the facade
use Messenger;
Messenger::from($user)->to([1,2,3,4,5])->message('Hey!')->send();
Sending to Thread
<?php
// Import the facade
use Messenger;
Messenger::from($user)->to($thread)->message('That\'s awesome!')->send();
Get count of new messages
Get global count - new messages in all user threads:, (*11)
<?php
echo $user->unreadMessagesCount;
Get count for a particular user thread:, (*12)
<?php
echo $user->threads->first()->unreadMessagesCount;
Mark thread as read
To mark a thread as read:, (*13)
<?php
$user->markThreadAsRead($thread_id);
Thread Dynamic Attributes
Threads dynamic attributes are attributes that doesn't come from the database, instead we generate them based on the data., (*14)
For example, threads doesn't have a title by itself, Messenger will create it based on the participants list., (*15)
Attributes:, (*16)
$thread->title
-
$thread->creator to get the thread creator.
-
$thread->lastMessage to get the latest message in the thread.
Displaying user threads
The controller:, (*17)
public function index()
{
// Eager Loading - this helps prevent hitting the
// database more than the necessary.
$this->user->load('threads.messages.sender');
return view('messages.index', [
'threads' => $this->user->threads
]);
}
The view:, (*18)
<div class="panel panel-default">
<div class="list-group">
@if($threads->count() > 0)
@foreach($threads as $thread)
@if($thread->lastMessage)
<a href="#" class="list-group-item">
<div class="clearfix">
<div class="pull-left">
<span class="h5">{{ $thread->title }}</span>
@if($thread->unreadMessagesCount > 0)
<span class="label label-success">{!! $thread->unreadMessagesCount !!}</span>
@endif
</div>
<span class="text-muted pull-right">{{ $thread->lastMessage->created_at->diffForHumans() }}</span>
</div>
<p class="text-muted no-margin">{{ str_limit($thread->lastMessage->body, 35) }}</p>
</a>
@endif
@endforeach
@endif
</div>
</div>
Preview:, (*19)
, (*20)
Using Models
Messenger has 3 models:, (*21)
Gerardojbaez\Messenger\Models\Message;
Gerardojbaez\Messenger\Models\MessageThread;
Gerardojbaez\Messenger\Models\MessageThreadParticipant;
You can use these as normal. For more details take a look to each model and the Gerardojbaez\Messenger\Traits\Messageable trait., (*22)
Config File
For now you can configure what models to use., (*23)
License
This package is free software distributed under the terms of the MIT license., (*24)