Hermes
A fully featured messaging package for Laravel 4, 5 and 5.1., (*1)
You can have conversations between multiple users to build a messenger with rooms or just a private 1to1 message system., (*2)
The Idea
- Conversation -> hasMany Users
- Conversation -> hasMany Messages
- Message -> hasOne User
- Message -> hasMany MessageState
- MessageState -> hasMany User
Like you see in the table above, Hermes is able to differ between different users when it comes to reading a message., (*3)
For example:, (*4)
There is a conversation between 3 users: User1, User2 and User3., (*5)
User1 writes a message and User2 reads it., (*6)
Then we have three MessageStates for this new message:
* MessageState for User1 is ‘own’
* MessageState for User2 is ‘read’
* MessageState for User3 is ‘unread’, (*7)
Install
Step 1: Composer.json
For Laravel 5
"require": {
...
"triggerdesign/hermes": "2.*"
}
For Laravel 4
"require": {
...
"triggerdesign/hermes": "1.0"
}
Run a composer update., (*8)
Step 2: app.php
'providers' => array(
...
\Triggerdesign\Hermes\HermesServiceProvider::class
);
...
'aliases' => array(
...
'Messaging' => Triggerdesign\Hermes\Facades\Messaging::class
);
Step 3: Publish migrations and config
php artisan vendor:publish
php artisan migrate
Now you have the 4 tables that we need for user conversations., (*9)
Step 4: Use the user trait
You should use a trait inside your User model:, (*10)
<?php
use Triggerdesign\Hermes\Models\UserTrait as HermesTrait;
...
class User extends BaseModel implements ConfideUserInterface
{
use HermesTrait;
...
Usage
Start a new conversation or find an existing one
Start a converstion between user with the ID 1 and the user with the ID 2. If there is allready one it will return the existing conversation., (*11)
//This will start a new conversation between user 1 and 2 or find an existing one
$conversation = Messaging::startConversation([1,2]);
//or try to find one on your own
$conversation = Messagging::findConversations($user_ids, $arguments, $limit);
Now you have access to these functions and attributes:, (*12)
//All messages in one conversation
$conversation->messages;
//Add a message
$conversation->addMessage($content);
$conversation->addUser($user);
$conversation->latestMessage();
$conversation->unreadMessages();
$conversation->isUnread(); //conversation has unread messages
$conversation->doRead(); //call this after a user has read his messages
You can also have groups of messages like in facebook. Several messages are collected into a group of messages, if they is not too much time in between and if they are all from one sender., (*13)
//Build an array of \Triggerdesign\Hermes\Classes\MessageGroup
$messageGroups = $conversation->buildGroups();
...
//now you can iterate throgh these groups and buld your own messenger
@foreach($messageGroups as $messageGroup)
<b>{{ $messageGroup->getUser()->name }}: @ {{ $messageGroup->getStart()->format('d.m.Y H:i:s'); }}</b>
@foreach($messageGroup->getMessages() as $message)
<p>{{ nl2br($message->content) }}</p>
@endforeach
@endforeach
Access the conversations of a user
The trait allows you to use these functions:, (*14)
//All conversations that this user is a member of
$user->conversations();
//How many messages are unread
$user->unreadMessagesCount();
$user->hasUnreadMessages();
//Get all unread conversations
$user->unreadConversations();
//Get all unread conversations inside all the unread conversations
$user->unreadMessages();
Configuration
The configuration files are published into your app directory., (*15)
- If you dont use the "users" table for storing your users you can rename it in hermes.usersTable
- Change the tableprefix if you want to: hermes.tablePrefix