[*: ActionStateMessageModel] улучшена реализация интерфейса ISerializable.

[*: ActionState] класс разбит на множество трейтов для более структурированности.

[*: ActionState] улучшена реализация интерфейса ISerializable.

[*: ActionState] класс внутреннего хранилища сообщений изменён на ObjectArray.

[*: ActionState] улучшена реализация метода Count.

[*: ActionState] улучшены реализации методов HasInfos, HasWarnings, HasErrors, IsSuccess, GetStringMessages и Clear.

 [*: ActionState] возвращаемое значение метода GetMessages заменено на ObjectArray.
This commit is contained in:
2025-05-05 17:39:34 +03:00
parent 18286ea99d
commit 2a03797bfe
9 changed files with 407 additions and 331 deletions

View File

@@ -7,10 +7,12 @@
namespace goodboyalex\php_components_pack\classes;
use Closure;
use goodboyalex\php_components_pack\enums\MessageType;
use goodboyalex\php_components_pack\interfaces\ISerializable;
use goodboyalex\php_components_pack\models\ActionStateMessageModel;
use goodboyalex\php_components_pack\traits\ActionState\ActionStateAddTrait;
use goodboyalex\php_components_pack\traits\ActionState\ActionStateGetTrait;
use goodboyalex\php_components_pack\traits\ActionState\ActionStateHasTrait;
use goodboyalex\php_components_pack\traits\ActionState\ActionStateStaticTrait;
/**
* Состояние действия.
@@ -28,9 +30,9 @@ final class ActionState implements ISerializable
public mixed $Value;
/**
* @var array $Messages Список информации
* @var ObjectArray $Messages Список информации
*/
private array $Messages = [];
private ObjectArray $Messages;
/**
* Конструктор
@@ -39,218 +41,24 @@ final class ActionState implements ISerializable
*/
public function __construct (mixed $defValue = null)
{
// Присваиваю значение по умолчанию
$this->Value = $defValue;
// Создаю список сообщений
$this->Messages = new ObjectArray([]);
}
/**
* При выводе GetStringMessages выводит только ошибки.
*
* @return Closure Возвращает функцию, проверяющую сообщение на соответствие типу.
*/
public static function GET_STRING_ERROR_ONLY (): Closure
{
return fn (ActionStateMessageModel $message)
=> $message->MessageType === MessageType::Error;
}
// Статичные методы и константы
use ActionStateStaticTrait;
/**
* При выводе GetStringMessages выводит ошибки и предупреждения.
*
* @return Closure Возвращает функцию, проверяющую сообщение на соответствие типу.
*/
public static function GET_STRING_ERROR_AND_WARNING (): Closure
{
return fn (ActionStateMessageModel $message)
=> $message->MessageType === MessageType::Error
|| $message->MessageType === MessageType::Warning;
}
// Методы добавления сообщений
use ActionStateAddTrait;
/**
* При выводе GetStringMessages выводит все сообщения.
*
* @return Closure Возвращает функцию, проверяющую сообщение на соответствие типу.
*/
public static function GET_STRING_ALL (): Closure
{
return fn (ActionStateMessageModel $message) => true;
}
// Методы проверки на наличие сообщений
use ActionStateHasTrait;
/**
* Добавляет данные из другого состояния.
*
* @param ActionState $state Другое состояние
* @param bool $clearAllBefore Очищать сообщения перед добавлением (true) или просто добавить к текущим (false)
*
* @return void
*/
public function AddState (ActionState $state, bool $clearAllBefore = false): void
{
// Если нужно очистить список сообщений
if ($clearAllBefore)
// - то очищаю список сообщений
$this->Clear(fn (ActionStateMessageModel $message) => true);
// Добавляю сообщения из другого состояния
$this->AddRange($state->GetMessages(function (ActionStateMessageModel $message)
{
return true;
}));
// Добавляю значение
$this->Value = $state->Value;
}
/**
* Очищает список сообщений, согласно условию.
*
* @param callable $predicate Условие выборки
*
* @return void
*/
public function Clear (callable $predicate): void
{
// Выбираю все сообщения, удовлетворяющие условию
$list = $this->GetMessages($predicate);
// Удаляю их из списка
$this->Messages = array_diff($this->Messages, $list);
}
/**
* Выбирает сообщения по условию predicate.
*
* @param callable $predicate Условие выборки
*
* @return array Список отобранных сообщений
*/
public function GetMessages (callable $predicate): array
{
// Получаю список элементов
$list = [];
// Для каждого элемента
foreach ($this->Messages as $actionStateMessage)
// - если он подходит под условие
if ($predicate($actionStateMessage))
// - добавляю его в список
$list[] = $actionStateMessage;
// Возвращаю список
return $list;
}
/**
* Добавляет список
*
* @param array $messages Список сообщений
*
* @return void
*/
public function AddRange (array $messages): void
{
$this->Messages = array_merge($this->Messages, $messages);
}
/**
* Возвращает список сообщений (параметр Message у каждого сообщения).
*
* @param callable $predicate Условие выборки
* @param string $separator Разделитель
*
* @return string Список сообщений
*/
public function GetStringMessages (callable $predicate, string $separator = '\n'): string
{
// Делаю выборку
$list = $this->GetMessages($predicate);
// Формирую список сообщений
$result = [];
// Для каждого сообщения из выборки
foreach ($list as $message) {
// - если оно не нужного нам класса
if (!$message instanceof ActionStateMessageModel)
// -- то пропускаю
continue;
// - добавляю сообщение
$result[] = $message->Message;
}
// Возвращаю список
return implode($separator, $result);
}
/**
* Добавляет сообщение о критической ошибке.
*
* @param string $message Сообщение
*
* @return void
*/
public function AddCritical (string $message): void
{
$this->Add(new ActionStateMessageModel(MessageType::Error, true, $message));
}
/**
* Добавление сообщения.
*
* @param ActionStateMessageModel $message Сообщение
*
* @return void
*/
public function Add (ActionStateMessageModel $message): void
{
$this->Messages[] = $message;
}
/**
* Добавляет сообщение об ошибке.
*
* @param string $message Сообщение
*
* @return void
*/
public function AddError (string $message): void
{
$this->Add(new ActionStateMessageModel(MessageType::Error, false, $message));
}
/**
* Добавляет предупреждение.
*
* @param string $message Сообщение.
*
* @return void
*/
public function AddWarning (string $message): void
{
$this->Add(new ActionStateMessageModel(MessageType::Warning, false, $message));
}
/**
* Добавляет информационное сообщение.
*
* @param string $message Сообщение.
*
* @return void
*/
public function AddInfo (string $message): void
{
$this->Add(new ActionStateMessageModel(MessageType::Info, false, $message));
}
/**
* Проверяет, есть ли информационные сообщения.
*
* @return bool Наличие сообщений
*/
public function HasInfos (): bool
{
return $this->Count(fn (ActionStateMessageModel $message) => $message->MessageType == MessageType::Info) > 0;
}
// Методы получения сообщений
use ActionStateGetTrait;
/**
* Количество сообщений, удовлетворяющих условию.
@@ -261,65 +69,7 @@ final class ActionState implements ISerializable
*/
public function Count (callable $predicate): int
{
// Получаю список сообщений
$list = $this->GetMessages($predicate);
// Возвращаю результат
return count($list);
}
/**
* Проверяет, успешно ли завершилась операция.
*
* @param bool $onlyCritical Игнорировать все некритические ошибки и предупреждения (не рекомендуется!)
*
* @return bool Успешно ли завершилась операция.
*/
public function IsSuccess (bool $onlyCritical = false): bool
{
// Если нужно учитывать только критические ошибки
if ($onlyCritical)
// - то проверяю наличие критических ошибок
return !$this->HasErrors($onlyCritical);
// Возвращаю результат
return !$this->HasErrors() && !$this->HasWarnings();
}
/**
* Проверяет, есть ли ошибки.
*
* @param bool $onlyCritical Учитывать только критические ошибки.
*
* @return bool Наличие ошибок.
*/
public function HasErrors (bool $onlyCritical = false): bool
{
return $this->Count(function (ActionStateMessageModel $message) use ($onlyCritical): bool
{
// - сравниваю тип сообщения
if ($message->MessageType != MessageType::Error)
// -- если не совпадает, то возвращаю false
return false;
// - если нужно выводить только критические ошибки, а сообщение не критическое
if ($onlyCritical && !$message->IsCritical)
// -- то возвращаю false
return false;
// Возвращаю true
return true;
});
}
/**
* Проверяет, есть ли предупреждения.
*
* @return bool Наличие предупреждений
*/
public function HasWarnings (): bool
{
return $this->Count(fn (ActionStateMessageModel $message) => $message->MessageType == MessageType::Warning) > 0;
return $this->Messages->Count($predicate);
}
/**
@@ -336,7 +86,7 @@ final class ActionState implements ISerializable
$list[] = $message->Serialize();
// Возвращаю результат
return serialize($list);
return json_encode($list);
}
/**
@@ -345,10 +95,10 @@ final class ActionState implements ISerializable
public function UnSerialize (string $serialized): void
{
// Очищаю список сообщений
$this->Clear(fn (ActionStateMessageModel $message) => true);
$this->Clear(self::GET_STRING_ALL());
// Десериализую список сообщений
$list = unserialize($serialized);
$list = json_decode($serialized, true);
// Для каждого сообщения
foreach ($list as $messageSerialized) {
@@ -360,4 +110,16 @@ final class ActionState implements ISerializable
$this->Add($message);
}
}
/**
* Очищает список сообщений, согласно условию.
*
* @param callable $predicate Условие выборки
*
* @return void
*/
public function Clear (callable $predicate): void
{
$this->Messages->Delete($predicate);
}
}