2024-05-06 16:00:47 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
namespace Modules\Plugins\Manifest;
|
|
|
|
|
|
|
|
use CodeIgniter\Validation\Validation;
|
|
|
|
use Exception;
|
|
|
|
|
|
|
|
abstract class ManifestObject
|
|
|
|
{
|
|
|
|
protected const VALIDATION_RULES = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var array<string,string|array{string}>
|
|
|
|
*/
|
|
|
|
protected const CASTS = [];
|
|
|
|
|
|
|
|
/**
|
2024-05-16 15:53:42 +00:00
|
|
|
* @var array<string,array<string,string>>
|
2024-05-06 16:00:47 +00:00
|
|
|
*/
|
2024-05-16 15:53:42 +00:00
|
|
|
protected static array $errors = [];
|
2024-05-06 16:00:47 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param mixed[] $data
|
|
|
|
*/
|
|
|
|
public function __construct(
|
2024-05-16 15:53:42 +00:00
|
|
|
protected readonly string $pluginKey,
|
|
|
|
private readonly array $data,
|
2024-05-06 16:00:47 +00:00
|
|
|
) {
|
2024-05-16 15:53:42 +00:00
|
|
|
self::$errors[$pluginKey] = [];
|
|
|
|
|
2024-05-06 16:00:47 +00:00
|
|
|
$this->load();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function __get(string $name): mixed
|
|
|
|
{
|
2024-05-09 17:55:41 +00:00
|
|
|
if (property_exists($this, $name)) {
|
2024-05-06 16:00:47 +00:00
|
|
|
return $this->{$name};
|
|
|
|
}
|
|
|
|
|
|
|
|
throw new Exception('Undefined object property ' . static::class . '::' . $name);
|
|
|
|
}
|
|
|
|
|
2024-05-12 18:38:33 +00:00
|
|
|
public function __isset(string $property): bool
|
|
|
|
{
|
|
|
|
return property_exists($this, $property);
|
|
|
|
}
|
|
|
|
|
2024-05-06 16:00:47 +00:00
|
|
|
public function load(): void
|
|
|
|
{
|
|
|
|
/** @var Validation $validation */
|
|
|
|
$validation = service('validation');
|
|
|
|
|
|
|
|
$validation->setRules($this::VALIDATION_RULES);
|
|
|
|
|
|
|
|
if (! $validation->run($this->data)) {
|
2024-05-16 15:53:42 +00:00
|
|
|
foreach ($validation->getErrors() as $key => $message) {
|
|
|
|
$this->addError($key, $message);
|
|
|
|
}
|
|
|
|
|
|
|
|
$validation->reset();
|
2024-05-06 16:00:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($validation->getValidated() as $key => $value) {
|
|
|
|
if (array_key_exists($key, $this::CASTS)) {
|
|
|
|
$cast = $this::CASTS[$key];
|
|
|
|
|
|
|
|
if (is_array($cast)) {
|
|
|
|
if (is_array($value)) {
|
|
|
|
foreach ($value as $valueKey => $valueElement) {
|
2024-05-16 15:53:42 +00:00
|
|
|
$value[$valueKey] = new $cast[0]($this->pluginKey, $valueElement);
|
2024-05-06 16:00:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2024-05-16 15:53:42 +00:00
|
|
|
$value = new $cast($this->pluginKey, $value ?? []);
|
2024-05-06 16:00:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->{$key} = $value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return array<string,string>
|
|
|
|
*/
|
2024-05-16 15:53:42 +00:00
|
|
|
public static function getPluginErrors(string $pluginKey): array
|
|
|
|
{
|
|
|
|
return self::$errors[$pluginKey];
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function addError(string $errorKey, string $errorMessage): void
|
2024-05-06 16:00:47 +00:00
|
|
|
{
|
2024-05-16 15:53:42 +00:00
|
|
|
self::$errors[$this->pluginKey][$errorKey] = $errorMessage;
|
2024-05-06 16:00:47 +00:00
|
|
|
}
|
|
|
|
}
|