dbmsv4/app/DTOs/UserDTO.php
2025-12-18 13:57:44 +09:00

56 lines
1.8 KiB
PHP

<?php
namespace App\DTOs;
class UserDTO extends CommonDTO
{
public ?int $uid = null;
public ?string $id = null;
public ?string $passwd = null;
public ?string $confirmpassword = null;
public ?string $name = null;
public ?string $email = null;
public ?string $mobile = null;
// __get이 동작하려면 public이 아닌 protected여야 합니다.
// public으로 선언되어 있으면 $dto->role 접근 시 __get을 거치지 않고 직접 접근합니다.
protected ?string $role = null;
public ?string $status = null;
public function __construct(array $datas = [])
{
// 1. [전처리] role이 배열로 들어왔다면 문자열로 변환하여 $datas 덮어쓰기
if (isset($datas['role']) && is_array($datas['role'])) {
$datas['role'] = implode(DEFAULTS["DELIMITER_ROLE"], $datas['role']);
}
// 2. 변환된 $datas를 가지고 부모(CommonDTO) 생성자 호출
// 이제 'role'은 문자열이므로 부모 클래스의 Reflection 로직이나 타입 검사를 통과합니다.
parent::__construct($datas);
}
/**
* role 속성을 읽을 때 자동으로 배열로 변환해서 반환
*/
public function __get(string $name): mixed
{
// role을 요청했고, 실제 데이터가 문자열로 존재한다면 배열로 변환
switch ($name) {
case 'role':
$value = is_string($this->name) ? explode(DEFAULTS["DELIMITER_ROLE"], $this->role) : [];
break;
default:
// 부모에게 위임 (혹시 CommonDTO에도 __get이 있다면)
$value = parent::__get($name);
break;
}
return $value;
}
// role 값을 설정할 때도 배열을 받을 수 있게 하려면 __set도 필요할 수 있습니다.
// (선택 사항)
public function setRole(array $roles): void
{
$this->role = implode(DEFAULTS["DELIMITER_ROLE"], $roles);
}
}