Chat/Message system for Laravel 5.x.
With Messenger:
- Users can send and receive messages.
- Users can participate in multiple conversations.
- Users can send messages to one or multiple users.
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');
- Laravel 5.x
- PHP >=5.5
$ composer require gerardojbaez/messenger
If you are using laravel 5.5 and later, you can skip the following two steps since this package supports package auto-discovery feature.
Add the package to your application service providers in config/app.php
file.
'providers' => [
/**
* Third Party Service Providers...
*/
Gerardojbaez\Messenger\MessengerServiceProvider::class,
]
Add the Facade to your aliases array:
'aliases' => [
[...]
'Messenger' => Gerardojbaez\Messenger\Facades\Messenger::class,
]
Publish package config file and migrations with the command:
$ php artisan vendor:publish --provider="Gerardojbaez\Messenger\MessengerServiceProvider"
Then run migrations:
$ php artisan migrate
Add Gerardojbaez/Messenger/Traits/Messageable
trait and Gerardojbaez/Messenger/Contracts/MessageableInterface
contract to your Users
model.
See the following example:
<?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;
<?php
// Import the facade
use Messenger;
Messenger::from($user)->to($user2)->message('Hey!')->send();
<?php
// Import the facade
use Messenger;
Messenger::from($user)->to([1,2,3,4,5])->message('Hey!')->send();
<?php
// Import the facade
use Messenger;
Messenger::from($user)->to($thread)->message('That\'s awesome!')->send();
Get global count - new messages in all user threads:
<?php
echo $user->unreadMessagesCount;
Get count for a particular user thread:
<?php
echo $user->threads->first()->unreadMessagesCount;
To mark a thread as read:
<?php
$user->markThreadAsRead($thread_id);
Threads dynamic attributes are attributes that doesn't come from the database, instead we generate them based on the data.
For example, threads doesn't have a title by itself, Messenger will create it based on the participants list.
Attributes:
$thread->title
$thread->creator
to get the thread creator.$thread->lastMessage
to get the latest message in the thread.
The controller:
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:
<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:
Messenger has 3 models:
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.
For now you can configure what models to use.
This package is free software distributed under the terms of the MIT license.