<?php
namespace App\Service;
use Exception;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class MessageService
{
/**
* @var Request|null
*/
private $request;
/**
* @var SessionInterface
*/
private $session;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var array
*/
private $allowed_types;
/**
* MessageService constructor.
* @param RequestStack $request_stack
* @param LoggerInterface $logger
*/
public function __construct(RequestStack $request_stack, LoggerInterface $logger)
{
// init request
$this->request = $request_stack->getCurrentRequest();
// init session
$this->session = $this->request->getSession();
// init logger
$this->logger = $logger;
// set allowed message types
$this->allowed_types = array(
'primary',
'secondary',
'success',
'danger',
'warning',
'info',
'light',
'dark'
);
// preset messages in session if not set yet
if (!$this->session->get('messages', false)) {
$this->session->set('messages', array());
}
}
/**
* @param string $message
* @param string $type
* @throws Exception
*/
public function setMessage(string $message, $type = 'primary', $override = false)
{
// check on valid message type
if (!in_array($type, $this->allowed_types)) {
throw new Exception("Message type $type is not allowed.");
}
// Remove all previous messages
if (!$override) {
// load all set messages from session
$messages_array = $this->session->get('messages');
// concatenate messages of same type
$message_set = false;
if(is_array($messages_array)){
foreach ($messages_array as &$message_array) {
if ($message_array[1] == $type) {
$message_array[0] .= " " . $message;
$message_set = true;
}
}
}
// add new message with new type
if (!$message_set) {
$messages_array[] = array($message, $type);
}
} else {
//Override
$messages_array = [[$message, $type]];
}
// save all messages to session
$this->session->set('messages', $messages_array);
}
/**
* @return mixed
*/
public function getMessages(){
return $this->session->get('messages');
}
/**
* Remove a specific message type from the session
* @param string $type
*/
public function removeMessage(string $type){
// Get all messages from session
$messages_array = $this->session->get('messages', []);
// Filter out messages of the given type
$messages_array = array_filter($messages_array, function ($message_array) use ($type) {
return $message_array[1] !== $type;
});
// Save the updated messages back to session
$this->session->set('messages', $messages_array);
}
/**
* Clear all messages from the session
*/
public function clearMessages(){
$this->session->remove('messages'); // Completely removes messages from session
}
}