PHP Message Container: Store and retrieve messages in different lockers

Recommend this page to a friend!
  Info   View files Example   View files View files (12)   DownloadInstall with Composer Download .zip   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2021-03-31 (18 days ago) RSS 2.0 feedNot enough user ratingsTotal: 41 All time: 10,056 This week: 36Up
Version License PHP version Categories
messagecontainer 1.0.0GNU Lesser Genera...5PHP 5, Data types
Description Author

This package can be used to store and retrieve messages in different lockers.

It can create a container that is divided in lockers that are distinguished by the locker name.

Applications can store and retrieve message string values in each locker of the container.

Each message is stored in a locker that can be of type error, warning, info and success.

Innovation Award
PHP Programming Innovation award nominee
March 2021
Nominee
Vote
A message bag is an approach used by some developers to store text messages in containers that have internal lockers to store each message according to the message type.

This approach allows a better organization of the way messages may be stored by applications.

This package provides a PHP implementation of the message bag storage approach.

Manuel Lemos
Picture of Jorge Castro
  Performance   Level  
Name: Jorge Castro <contact>
Classes: 22 packages by
Country: Chile Chile
Innovation award
Innovation award
Nominee: 11x

Winner: 2x

Details

MessageContainer

It is a Message Container for PHP, similar in functionality MessageBag for Laravel. However this is aimed for speed and usability and it doesn't have any dependency. This class is simple: 2 classes, no dependency and nothing more. You can use in any PHP project.

Packagist Total Downloads [Maintenance]() [composer]() [php]() [php]() [php]() [CocoaPods]()

What is the objective?

This library stores messages (strings) in different lockers and each locker could contain different messages with different levels (error, warning, info and success). The goal of this library:

  • It stores messages depending of an "id", including the severity and message (a simple text).
  • The library does not generate an error if the value we want to read does not exists, So we don't need to use of isset() in our code. It also avoids the use of count() and is_array() in our code, this library already does it for us. * It returns an empty value (not null) if the message does not exist or if there is no message. * It returns an empty array (not null) if the list of messages does not exist * It returns an empty locker (not null) if the locker does not exist.
  • It is possible to returns the first error or warning at the same time. In this case, if the locker stores an error and a warning, then it returns the error (it has priority).
  • It is able to return: * all messages stored in some locker or container. * the first message (with or without some level) * the number of messages (for some level) * if the container of locker has error or warning.
  • It is as fast as possible

It is an example from where we could use it, the validation of a form (this library does not validate or show values it only stores the information)

docs/validation_example.png

In this example, we have :

  • one container (the form)
  • multiples textboxes (each one is a locker)
  • and each textbox (our lockers) could contain one of more messages with different levels (in this case, success or error).

If we use plain-PHP, we could show some messages of the password:

echo $container['password']['error'];

But what if the id password does not contain any message, or if there is no error? of if there is more than error?

So we could re-define something like that: (but it will still fail if there is more than one error)

if (isset($container['password'])) {
    if(isset($container['password']['error'])) {
        echo $container['password']['error'];
    }
}

And with our library

// We could show the first error (or empty if none):
echo $container->getLocker('password')->firstError(); 

// it shows all errors (or nothing if none):
foreach($container->getLocker('password')->allError() as $msg) {
    echo $msg;
} 

How to use it

use eftec\MessageContainer;
$container=new MessageContainer(); // we create the full lockers
$container->addItem('locker1','It is a message','warning');  // we store a message inside "id1"
$container->addItem('locker1','It is a message','error');  // we store another message inside "id1"

// And later, you can process it

$lastErrorsOrWarnings=$container->get('locker1')->allErrorOrWarning();
// it will not crash even if the locker2 does not exists.
$lastErrorsOrWarnings2=$container->get('locker2')->allErrorOrWarning();

Definitions

Lets say the next example of container that shows every part of the Container.

docs/img1.png

We have 3 levels of spaces.

  • Container. Usually it is unique and it is defined by our instance of MessageContainer. The container could contains from zero to multiples lockers. Each locker is identified by an unique "id".
  • Locker. Every time we add an item, we could create or update a new container. Every locker could contain from zero to many error, warning, info or success and each one could contain from zero to many messages.
  • Our messages or items are categorized in 4 levels, error, warning, info and success. Each level could contain one or many messages (or none)

Messages are leveled as follows

| id | Description | Example | | ------- | ------------------------------------------------------------ | ----------------------------------------- | | error | The message is an error, and it must be solved. It is our show stopper. | Database is down | | warning | The message is a warning that maybe it could be ignored. However, the class MessageContainer could allow to group Error and Warning as the same. | The registry was stored but with warnings | | info | The message is information. For example, to log or debug an operation. | Log is stored | | success | The message is a successful operation | Order Accepted |

Example:

$container=new MessageContainer();
$container->addItem('id1','some msg 1','error');
$container->addItem('id1','some msg 2','error');
$container->addItem('id1','some msg 1','warning');

$container->addItem('id2','some msg 1','info');
$container->addItem('id2','some msg 1','success');

$container->addItem('id33','some msg 1','error');
$container->addItem('id33','some msg 2','error');
$container->addItem('id33','some msg 1','success');
$container->addItem('id33','some msg 2','success');
$container->addItem('id33','some msg 2','success');

// obtaining information per locker
$msg=$container->getLocker('id1')->firstErrorOrWarning(); // returns if the locker id1 has an error or warning
$msg2=$container->getLocker('id2')->allInfo(); // returns all info store in locker id2 ["some msg1","some msg2"]
$msg3=$container->getLocker('id3')->allInfo(); // (note this locker is not defined so it returns an empty array.
$msg4=$container->getLocker('id33')->hasError(); // returns true if there is an error.
$msg5=$container->getLocker('id33')->countError(); // returns the number of errors (or zero if none).

// obtaining information globally (all lockers)
$msg7=$container->hasError(); // returns true if there is an error in any locker.
$msg8=$container->allErrorArray(true); // returns all errors and warnings presents in any locker.

Adding a new message

To add a new message inside a locker, we use the method addItem()

$container->addItem(<idlocker>,<message>,<level>,<context array>);

Where

  • idlocker is the identifier of the locker to where we will store our message.
  • message is the string of the message. The message could show variables using the syntax:{{variablename}}. Example"The value <u>{{variable}}</u> is not valid"* We could show the id of the locker using the syntax{{_idlocker}}. Example:"The variable <u>{{_idlocker}}</u> is empty"*
  • level is the level of message. It could be error, warning, info and success. By default this value is "error"
  • context (optional) is an associative array used to show a message with a variable. The context is set only once per locker.
// without context:
$container->addItem('locker1','The variable price must be higher than 200','warning');

// with context:
// The variable price must be higher than 200
$container->addItem('locker2'
                    ,'The variable {{var1}} must be higher than {{var2}}'
                    ,'warning'
                    ,['var1'=>'price','var2'=>200]);
// The variable price must be higher than 200 (not 500, the context is not updated this second time)
$container->addItem('locker2'
                    ,'The variable {{var1}} must be higher than {{var2}}'
                    ,'warning'
                    ,['var1'=>'price','var2'=>500]);
// The variable price must be higher than 200 (we use the previous context)
$container->addItem('locker2'
                    ,'The variable {{var1}} must be higher than {{var2}}'
                    ,'warning');

> Note: We could add one or many messages to a locker. In the later example, the locker locker2 stores 3 messages. > > Note: The message is evaluated when we call the method addItem()

Getting the messages

MessageContainer stores a list of lockers of messages. It's aimed at convenience, so it features many methods to access the information in different ways.

Messages are ranked as follows

| id | Description | Example | | ------- | ------------------------------------------------------------ | ----------------------------------------- | | error | The message is an error, and it must be solved. It is a show stopper. | Database is down | | warning | The message is a warning that maybe it could be ignored. | The registry was stored but with warnings | | info | The message is information | Log is stored | | success | The message is a successful operation | Order Accepted |

Sometimes, both errors are warning are considered as equals. So the system allows reading an error or warning.

Error always has the priority, then warning, info and success. If you want to read the first message, then it starts searching for errors.

You can obtain a message as an array of objects of the type MessageLocker, as an array of string, or as a single string (first message)

$container->get('idfield'); // container idfield
$container->get('idfield2'); // container idfield2

if($container->hasError()) {
    // Error: we do something here.
    echo "we found ".$container->errorCount()." errors in all lockers";   
}

// using messageList
if($container->hasError()) {
    // Error: we do something here.
    echo "we found ".$container->errorcount." errors in all lockers";
    
}

MessageContainer

Count of messages of all lockers

| Name of the field | Type | Description | | ----------------- | ---- | --------------------------------------------------- | | $errorCount | int | Get the number of errors in all lockers | | $warningCount | int | Get the number of warnings in all lockers | | $errorOrWarning | int | Get the number of errors or warnings in all lockers | | $infoCount | int | Get the number of information messages. | | $successCount | int | Get the number of success messages. |

Example:

if ($container->errorcount>0) {
    // some error
}

Obtain messages or text of all lockers

| Name | Type | Description | Example of result | | ------------------ | ------ | ------------------------------------------------------------ | ----------------------------------------- | | firstErrorText() | method | Returns the first message of error of all lockers | "Error in field" | | firstWarningText() | method | Returns the first message of warning of all lockers | "warning in field" | | firstInfoText() | method | Returns the first message of info of all lockers | "info: log" | | firstSuccessText() | method | Returns the first message of success of all lockers | "Operation successful" | | allError() | method | Returns all errors of all lockers (as an array of objects of the type MessageLocker) | MessageLocker[] | | allWarning() | method | Returns all warning of all lockers (as an array of objects of the type MessageLocker) | MessageLocker[] | | allInfo() | method | Returns all info of all lockers (as an array of objects of the type MessageLocker) | MessageLocker[] | | allSuccess() | method | Returns all success of all lockers (as an array of objects of the type MessageLocker) | MessageLocker[] | | allErrorArray() | method | Returns all errors of all lockers (as an array of texts) | ["Error in field1","Error in field2"] | | allWarningArray() | method | Returns all warning of all lockers (as an array of texts) | ["Warning in field1","Warning in field2"] | | allInfoArray() | method | Returns all info of all lockers (as an array of texts) | ["Info in field1","Info in field2"] | | allSuccessArray | method | Returns all success of all lockers (as an array of texts) | ["Info in field1","Info in field2"] |

echo $container->firstErrorText(); // returns first error if any
$array=$container->allError();  // MessageLocker[]
echo $array[0]->firstError(); 
$array=$container->allErrorArray();  // string[]
echo $array[0]; 

Css for a specific container

It is possible to obtain a CSS class based in the current level or state of a container.

  • $cssClasses (field) is an associative array to use with the method cssClass()
  • cssClasses() is method that returns a class based in the type of level of the container
$css=$this-messageList->cssClasses('container1');

Misc

| Name | Type | Description | | ---------- | ------ | ------------------------------------------------------------ | | $items | field | We get all lockers (array of the type MessageLocker). Each container could contain many messages. | | resetAll() | method | $array=$this-messageList->items; $this-messageList->items['id'];Delete all lockers and reset counters | | addItem() | method | It adds a new message to a container | | allIds() | method | Get all the id of the lockers | | get() | method | Get a container (as an object of the type MessageLocker). You can also use items[] | | hasError() | method | Returns true if there is an error. |

echo $container->resetAll(); // resets all lockers
$container->addItem('containerid','it is a message','error'); // we add an error in the container with #id containerid
$array=$container->allIds(); // ['containerid']
var_dump($validation->get('containerid'));  // object MessageLocker

$array=$this-messageList->items;
var_dump($this-messageList->items['containerid']); // object MessageLocker

if($container->hasError()) { // $validation->hasError() does the same
    echo "there is an error";
}

MessageLocker

Inside MessageContainer we could have one or many lockers( MessageLocker ).

Obtain messages of a specific container

| Name | Type | Description | Example of result | | ------------------ | ------ | --------------------------------------------------------- | ----------------------------------------- | | firstErrorText() | method | Returns the first message of error of a container | "Error in field" | | firstWarningText() | method | Returns the first message of warning of a container | "warning in field" | | firstInfoText() | method | Returns the first message of info of a container | "info: log" | | firstSuccessText() | method | Returns the first message of success of a container | "Operation successful" | | allError() | method | Returns all errors of a container (as an array of texts) | ["Error in field1","Error in field2"] | | allWarning() | method | Returns all warning of a container (as an array of texts) | ["Warning in field1","Warning in field2"] | | allInfo() | method | Returns all info of a container (as an array of texts) | ["Info in field1","Info in field2"] | | allSuccess() | method | Returns all success of a container (as an array of texts) | ["Info in field1","Info in field2"] |

$container->get('idfield'); // container idfield 

echo $container->firstErrorText(); // we show the first error (if any) in the container
var_dump($container->allError); // we show the all errors

Definitions of the classes

MessageContainer

Class MessageList

Field items (MessageLocker[])

Array of containers

Field errorCount (int)

Number of errors stored globally

Field warningCount (int)

Number of warnings stored globally

Field errorOrWarningCount (int)

Number of errors or warning stored globally

Field infoCount (int)

Number of information stored globally

Field successCount (int)

Number of success stored globally

Field cssClasses (string[])

Used to convert a type of message to a css class

Method __construct()

MessageList constructor.

Method resetAll()

It resets all the container and flush all the results.

Method addItem()

You could add a message (including errors,warning..) and store it in a $idLocker

Parameters:

  • $idLocker Identified of the locker (where the message will be stored) (string)
  • $message message to show. Example: 'the value is incorrect' (string)
  • $level =['error','warning','info','success']$i
  • $context [optional] it is an associative array with the values of the item<br> For optimization, the context is not update if exists another context. (array)

Method allIds()

It obtains all the ids for all the lockers.

Method get()

Alias of $this->getMessage()

Parameters:

  • $idLocker Id of the locker (string)

Method getLocker()

It returns a MessageLocker containing an locker.<br> <b>If the locker doesn't exist then it returns an empty object (not null)</b>

Parameters:

  • $idLocker Id of the locker (string)

Method cssClass()

It returns a css class associated with the type of errors inside a locker<br> If the locker contains more than one message, then it uses the most severe one (error,warning,etc.)<br> The method uses the field <b>$this->cssClasses</b>, so you can change the CSS classes. <pre> $this->clsssClasses=['error'=>'class-red','warning'=>'class-yellow','info'=>'class-green','success'=>'class-blue']; $css=$this->cssClass('customerId'); </pre>

Parameters:

  • $idLocker Id of the locker (string)

Method firstErrorOrWarning()

It returns the first message of error or empty if none<br> If not, then it returns the first message of warning or empty if none

Parameters:

  • $default if not message is found, then it returns this value (string)

Method firstErrorText()

It returns the first message of error or empty if none

Parameters:

  • $default if not message is found, then it returns this value. (string)
  • $includeWarning if true then it also includes warning but any error has priority. (bool)

Method firstWarningText()

It returns the first message of warning or empty if none

Parameters:

  • $default if not message is found, then it returns this value (string)

Method firstInfoText()

It returns the first message of information or empty if none

Parameters:

  • $default if not message is found, then it returns this value (string)

Method firstSuccessText()

It returns the first message of success or empty if none

Parameters:

  • $default if not message is found, then it returns this value (string)

Method allArray()

It returns an array with all messages of any type of all lockers

Parameters:

  • $level =[null,'error','warning','errorwarning','info','success'][$i] the level to show.<br> Null means it shows all errors (null|string)

Method allErrorArray()

It returns an array with all messages of error of all lockers.

Parameters:

  • $includeWarning if true then it also include warnings. (bool)

Method allWarningArray()

It returns an array with all messages of warning of all lockers.

Method allErrorOrWarningArray()

It returns an array with all messages of errors and warnings of all lockers.

Method allInfoArray()

It returns an array with all messages of info of all lockers.

Method AllSuccessArray()

It returns an array with all messages of success of all lockers.

Method allAssocArray()

It returns an associative array of the form <br> <pre> [ ['id'=>'', // id of the locker 'level'=>'' // level of message (error, warning, info or success) 'msg'=>'' // the message to show ] ] </pre>

Parameters:

  • $level param null|string $level (null|string)

Method hasError()

It returns true if there is an error (or error and warning).

Parameters:

  • $includeWarning If true then it also returns if there is a warning (bool)

MessageLocker

Class MessageLocker

Method __construct()

MessageLocker constructor.

Parameters:

  • $idLocker param null|string $idLocker (null|string)
  • $context param array|null $context (array|null)

Method setContext()

We set the context only if the current context is null.

Parameters:

  • $context The new context. (array|null)

Method addError()

It adds an error to the locker.

Parameters:

  • $msg The message to store (mixed)

Method replaceCurlyVariable()

Replaces all variables defined between {{ }} by a variable inside the dictionary of values.<br> Example:<br> replaceCurlyVariable('hello={{var}}',['var'=>'world']) // hello=world<br> replaceCurlyVariable('hello={{var}}',['varx'=>'world']) // hello=<br> replaceCurlyVariable('hello={{var}}',['varx'=>'world'],true) // hello={{var}}<br>

Parameters:

  • $string The input value. It could contains variables defined as {{namevar}} (string)

Method addWarning()

It adds a warning to the locker.

Parameters:

  • $msg The message to store (mixed)

Method addInfo()

It adds an information to the locker.

Parameters:

  • $msg The message to store (mixed)

Method addSuccess()

It adds a success to the locker.

Parameters:

  • $msg The message to store (mixed)

Method countErrorOrWarning()

It returns the number of errors or warnings contained in the locker

Method countError()

It returns the number of errors contained in the locker

Method countWarning()

It returns the number of warnings contained in the locker

Method countInfo()

It returns the number of infos contained in the locker

Method countSuccess()

It returns the number of successes contained in the locker

Method first()

It returns the first message of any kind.<br> If error then it returns the first message of error<br> If not, if warning then it returns the first message of warning<br> If not, then it show the first info message (if any)<br> If not, then it shows the first success message (if any)<br> If not, then it shows the default message.

Parameters:

  • $defaultMsg param string $defaultMsg (string)
  • $level =[null,'error','warning','errorwarning','info','success'][$i] the level to show (by default it shows the first message of any level , starting with error) (null|string)

Method firstError()

It returns the first message of error, if any. Otherwise it returns the default value

Parameters:

  • $default param string $default (string)

Method firstWarning()

It returns the first message of warning, if any. Otherwise it returns the default value

Parameters:

  • $default param string $default (string)

Method firstErrorOrWarning()

It returns the first message of error or warning (in this order), if any. Otherwise it returns the default value

Parameters:

  • $default param string $default (string)

Method firstInfo()

It returns the first message of info, if any. Otherwise it returns the default value

Parameters:

  • $default param string $default (string)

Method firstSuccess()

It returns the first message of success, if any. Otherwise it returns the default value

Parameters:

  • $default param string $default (string)

Method all()

Returns all messages or an empty array if none.

Parameters:

  • $level =[null,'error','warning','errorwarning','info','success'][$i] the level to show. Null means it shows all errors (null|string)

Method allError()

Returns all messages of errors (as an array of string), or an empty array if none.

Method allWarning()

Returns all messages of warning, or an empty array if none.

Method allErrorOrWarning()

Returns all messages of errors or warnings, or an empty array if none

Method allInfo()

Returns all messages of info, or an empty array if none.

Method allSuccess()

Returns all messages of success, or an empty array if none.

Method allAssocArray()

It returns an associative array of the form:<br> <pre> [ ['id'=>'', // id of the locker 'level'=>'' // level of message (error, warning, info or success) 'msg'=>'' // the message to show ] ] </pre>

Parameters:

  • $level =[null,'error','warning','errorwarning','info','success'][$i] the level to show. Null means it shows all messages regardless of the level (starting with error) (null|string)

Method hasError()

It returns true if there is an error (or error and warning).

Parameters:

  • $includeWarning If true then it also returns if there is a warning (bool)

changelog

  • 1.2 2021-03-21 Added new methods. * Optionally, messages could use variables obtained from a context. The context is per locker. Example "it is a {{variable}}"
  • 1.1 2021-03-17 some cleanups
  • 1.0 2021-03-17 first version
  Files folder image Files  
File Role Description
Files folder imagedocs (3 files)
Files folder imageexamples (1 file)
Files folder imagelib (2 files)
Files folder imagetests (2 files)
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file LICENSE Lic. License text
Accessible without login Plain text file phpunit.xml Data Auxiliary data
Accessible without login Plain text file README.md Doc. Documentation

  Files folder image Files  /  docs  
File Role Description
  Accessible without login Plain text file diagram.drawio Data Auxiliary data
  Accessible without login Image file img1.png Icon Icon image
  Accessible without login Image file validation_example.png Icon Icon image

  Files folder image Files  /  examples  
File Role Description
  Accessible without login Plain text file basicexample.php Example Example script

  Files folder image Files  /  lib  
File Role Description
  Plain text file MessageContainer.php Class Class source
  Plain text file MessageLocker.php Class Class source

  Files folder image Files  /  tests  
File Role Description
  Accessible without login Plain text file bootstrap.php Aux. Auxiliary script
  Plain text file MessageContainerTest.php Class Class source

 Version Control Unique User Downloads Download Rankings  
 100%
Total:41
This week:0
All time:10,056
This week:36Up

For more information send a message to info at phpclasses dot org.