20250612
* Добавлен атрибут для свойств класса #[GetOnly]. Он маркирует только те свойства, которые имеют только get часть, чтобы при маппинге класс корректно его прошёл. * Улучшен класс ClassMapper. В его базовый метод добавлена проверка на атрибут #[GetOnly].
This commit is contained in:
		
							
								
								
									
										29
									
								
								sources/attributes/GetOnly.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								sources/attributes/GetOnly.php
									
									
									
									
									
										Normal 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 () | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @@ -5,8 +5,10 @@ namespace goodboyalex\php_components_pack\classes; | ||||
| use DateTimeImmutable; | ||||
| use DateTimeInterface; | ||||
| use Exception; | ||||
| use ReflectionAttribute; | ||||
| use ReflectionClass; | ||||
| use ReflectionException; | ||||
| use ReflectionProperty; | ||||
| use stdClass; | ||||
| use UnitEnum; | ||||
|  | ||||
| @@ -15,7 +17,7 @@ use UnitEnum; | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @version 1.0.1 | ||||
|  * @since 1.0 | ||||
|  */ | ||||
| final class ClassMapper | ||||
| @@ -59,6 +61,11 @@ final class ClassMapper | ||||
|                 // -- пропускаю | ||||
|                 continue; | ||||
|  | ||||
|             // - если свойство маркируется как GetOnly | ||||
|             if (self::HasGetOnlyAttributes($from, $name)) | ||||
|                 // -- пропускаю | ||||
|                 continue; | ||||
|  | ||||
|             // - если свойство не разрешено | ||||
|             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); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Подготавливает значения свойств класса. | ||||
|      * | ||||
|   | ||||
		Reference in New Issue
	
	Block a user