src/Service/MessageService.php line 82

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use Exception;
  4. use Psr\Log\LoggerInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  8. class MessageService
  9. {
  10.     /**
  11.      * @var Request|null
  12.      */
  13.     private $request;
  14.     /**
  15.      * @var SessionInterface
  16.      */
  17.     private $session;
  18.     /**
  19.      * @var LoggerInterface
  20.      */
  21.     private $logger;
  22.     /**
  23.      * @var array
  24.      */
  25.     private $allowed_types;
  26.     /**
  27.      * MessageService constructor.
  28.      * @param RequestStack $request_stack
  29.      * @param LoggerInterface $logger
  30.      */
  31.     public function __construct(RequestStack $request_stackLoggerInterface $logger)
  32.     {
  33.         // init request
  34.         $this->request $request_stack->getCurrentRequest();
  35.         // init session
  36.         $this->session $this->request->getSession();
  37.         // init logger
  38.         $this->logger $logger;
  39.         // set allowed message types
  40.         $this->allowed_types = array(
  41.             'primary',
  42.             'secondary',
  43.             'success',
  44.             'danger',
  45.             'warning',
  46.             'info',
  47.             'light',
  48.             'dark'
  49.         );
  50.         // preset messages in session if not set yet
  51.         if (!$this->session->get('messages'false)) {
  52.             $this->session->set('messages', array());
  53.         }
  54.     }
  55.     /**
  56.      * @param string $message
  57.      * @param string $type
  58.      * @throws Exception
  59.      */
  60.     public function setMessage(string $message$type 'primary'$override false)
  61.     {
  62.         // check on valid message type
  63.         if (!in_array($type$this->allowed_types)) {
  64.             throw new Exception("Message type $type is not allowed.");
  65.         }
  66.         // Remove all previous messages
  67.         if (!$override) {
  68.             // load all set messages from session
  69.             $messages_array $this->session->get('messages');
  70.             // concatenate messages of same type
  71.             $message_set false;
  72.             if(is_array($messages_array)){
  73.                 foreach ($messages_array as &$message_array) {
  74.                     if ($message_array[1] == $type) {
  75.                         $message_array[0] .= " " $message;
  76.                         $message_set true;
  77.                     }
  78.                 }
  79.             }
  80.             // add new message with new type
  81.             if (!$message_set) {
  82.                 $messages_array[] = array($message$type);
  83.             }
  84.         } else {
  85.             //Override
  86.            $messages_array = [[$message$type]];
  87.         }
  88.         // save all messages to session
  89.         $this->session->set('messages'$messages_array);
  90.     }
  91.     /**
  92.      * @return mixed
  93.      */
  94.     public function getMessages(){
  95.         return $this->session->get('messages');
  96.     }
  97.     /**
  98.      * Remove a specific message type from the session
  99.      * @param string $type
  100.      */
  101.     public function removeMessage(string $type){
  102.         // Get all messages from session
  103.         $messages_array $this->session->get('messages', []);
  104.         // Filter out messages of the given type
  105.         $messages_array array_filter($messages_array, function ($message_array) use ($type) {
  106.             return $message_array[1] !== $type;
  107.         });
  108.         // Save the updated messages back to session
  109.         $this->session->set('messages'$messages_array);
  110.     }
  111.     /**
  112.      * Clear all messages from the session
  113.      */
  114.     public function clearMessages(){
  115.         $this->session->remove('messages'); // Completely removes messages from session
  116.     }
  117. }