* Добавлен атрибут для свойств класса #[GetOnly]. Он маркирует только те свойства, которые имеют только get часть, чтобы при маппинге класс корректно его прошёл.

* Улучшен класс ClassMapper. В его базовый метод добавлена проверка на атрибут #[GetOnly].
This commit is contained in:
Александр Бабаев 2025-06-14 09:53:55 +03:00
parent a439c0d2c9
commit a58b6f1358
2 changed files with 63 additions and 1 deletions

View File

@ -0,0 +1,29 @@
<?php
/**
* Отключаю несущественные инспекции (из-за Attribute)
*
* @noinspection PhpMultipleClassDeclarationsInspection
*/
namespace goodboyalex\php_components_pack\attributes;
use Attribute;
/**
* Атрибут указания, что параметр является параметром только для чтения и не подлежит маппингу.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0.25
*/
#[Attribute(flags: Attribute::TARGET_PROPERTY)]
final readonly class GetOnly
{
/**
* Конструктор
*/
public function __construct ()
{
}
}

View File

@ -5,8 +5,10 @@ namespace goodboyalex\php_components_pack\classes;
use DateTimeImmutable; use DateTimeImmutable;
use DateTimeInterface; use DateTimeInterface;
use Exception; use Exception;
use ReflectionAttribute;
use ReflectionClass; use ReflectionClass;
use ReflectionException; use ReflectionException;
use ReflectionProperty;
use stdClass; use stdClass;
use UnitEnum; use UnitEnum;
@ -15,7 +17,7 @@ use UnitEnum;
* *
* @author Александр Бабаев * @author Александр Бабаев
* @package php_components_pack * @package php_components_pack
* @version 1.0 * @version 1.0.1
* @since 1.0 * @since 1.0
*/ */
final class ClassMapper final class ClassMapper
@ -59,6 +61,11 @@ final class ClassMapper
// -- пропускаю // -- пропускаю
continue; continue;
// - если свойство маркируется как GetOnly
if (self::HasGetOnlyAttributes($from, $name))
// -- пропускаю
continue;
// - если свойство не разрешено // - если свойство не разрешено
if (count($options['allowed']) > 0 && !in_array($name, $options['allowed'])) if (count($options['allowed']) > 0 && !in_array($name, $options['allowed']))
// -- пропускаю // -- пропускаю
@ -71,6 +78,32 @@ final class ClassMapper
} }
} }
/**
* Проверяет, есть ли у свойства класса $class атрибуты GetOnly.
*
* @param object $class Объект класса.
* @param string $propertyName Имя свойства.
*
* @return bool true если у свойства есть атрибут GetOnly, иначе false.
*/
private static function HasGetOnlyAttributes (object $class, string $propertyName): bool
{
// Создаем отражение свойства класса
try {
$reflectionProperty = new ReflectionProperty(get_class($class), $propertyName);
}
catch (ReflectionException) {
// - возвращаю false, если произошла ошибка создания отражения свойства класса
return false;
}
// Получаем список атрибутов у данного свойства
$attributes = $reflectionProperty->getAttributes('GetOnly', ReflectionAttribute::IS_INSTANCEOF);
// Возвращаем true, если атрибут найден, иначе false
return !empty($attributes);
}
/** /**
* Подготавливает значения свойств класса. * Подготавливает значения свойств класса.
* *