Skip to content

Messages, Locks, And Errors

Packages should use QUIQQER's message and lock APIs instead of ad-hoc status storage or direct UI notifications.

Messages

Use the message handler for user-facing messages.

php
QUI::getMessageHandler()->addSuccess('The item was saved.');
QUI::getMessageHandler()->addInformation('The import has started.');
QUI::getMessageHandler()->addAttention('The item requires attention.');
QUI::getMessageHandler()->addError('The item could not be saved.');

add*() methods add messages for the current response. Use send*() methods when a message should be stored for a specific user and shown later.

php
$User = QUI::getUsers()->get($userId);

QUI::getMessageHandler()->sendInformation(
    $User,
    'The background import has finished.'
);

Do not use messages as logs. Use QUI\System\Log for operational diagnostics and messages only for information that should be visible to users.

JavaScript Messages

Browser controls can use the frontend message handler:

javascript
QUI.getMessageHandler().then(function (MH) {
    MH.addSuccess('Saved');
    MH.addError('Could not save the item');
});

Use JavaScript messages for immediate UI feedback after Ajax requests or local interactions.

Locks

Use QUI\Lock\Locker when an object must not be edited or processed concurrently.

php
$Package = QUI::getPackage('vendor/package');
$key = 'import-' . $importId;

QUI\Lock\Locker::checkLocked($Package, $key);
QUI\Lock\Locker::lock($Package, $key, 600);

try {
    // Run exclusive work.
} finally {
    QUI\Lock\Locker::unlock($Package, $key);
}

Use a package-specific key that identifies the locked object or process. lock() stores the lock in the cache and uses the session lifetime when no lifetime is provided.

For user-facing edit locks, use lockWithPermissions() and unlockWithPermissions() when the operation must also check permissions.

Error Codes

QUIQQER exceptions can carry numeric or symbolic codes. Use stable error codes when callers need to distinguish known failure cases.

php
throw new QUI\Exception(
    'The item already exists.',
    1108
);

For a package, define package-local constants when the same codes are used in multiple classes:

php
namespace Vendor\Package;

final class ErrorCodes
{
    public const ITEM_NOT_FOUND = 2101;
    public const ITEM_ALREADY_EXISTS = 2102;
}

Keep error codes stable once they are used by UI code, tests, API consumers, or logs.

Practical Rules

  • Use messages for user-visible feedback.
  • Use logs for diagnostics.
  • Always release locks in a finally block.
  • Use short, package-specific lock keys.
  • Keep error codes documented in the package when they are part of public behavior.

Released under GPL-3.0-or-later.