From 05d9d8aff3ee21325387df4e26eda4efb4b8511c Mon Sep 17 00:00:00 2001 From: taekyoungc Date: Mon, 29 Jun 2026 20:06:07 +0900 Subject: [PATCH] =?UTF-8?q?hotfix:=20auditSkipUpdateOnlyFields=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=8D=BC=ED=8B=B0=E2=86=92=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD(=EB=A1=9C=EA=B7=B8=EC=9D=B8=2050?= =?UTF-8?q?0=20=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit trait와 MemberModel이 같은 프로퍼티를 다른 기본값으로 선언해 PHP 비호환 fatal → 로그인(member update) 시 500. 메서드 override 방식으로 변경해 해결. Co-Authored-By: Claude Opus 4.8 --- app/Models/MemberModel.php | 5 ++++- app/Models/Traits/Auditable.php | 14 ++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/Models/MemberModel.php b/app/Models/MemberModel.php index 73242c5..ec16cb2 100644 --- a/app/Models/MemberModel.php +++ b/app/Models/MemberModel.php @@ -9,7 +9,10 @@ class MemberModel extends Model use \App\Models\Traits\Auditable; /** 로그인/세션 갱신만 있는 update는 활동 로그에 남기지 않음(로그인 이력은 별도 기록) */ - protected array $auditSkipUpdateOnlyFields = ['mb_latestdate', 'mb_login_fail_count', 'mb_locked_until', 'mb_session_token']; + protected function auditSkipUpdateOnlyFields(): array + { + return ['mb_latestdate', 'mb_login_fail_count', 'mb_locked_until', 'mb_session_token']; + } protected $table = 'member'; protected $primaryKey = 'mb_idx'; diff --git a/app/Models/Traits/Auditable.php b/app/Models/Traits/Auditable.php index 3c4800b..18eca1e 100644 --- a/app/Models/Traits/Auditable.php +++ b/app/Models/Traits/Auditable.php @@ -41,9 +41,14 @@ trait Auditable /** * 이 필드들'만' 변경된 update는 활동 로그를 남기지 않는다. * (예: 로그인/세션 갱신 같은 시스템 내부 변경 — 노이즈 제거) - * 모델에서 재정의해 사용. + * 모델에서 이 메서드를 override 해 사용. (프로퍼티로 두면 trait/class 비호환 오류) + * + * @return list */ - protected array $auditSkipUpdateOnlyFields = []; + protected function auditSkipUpdateOnlyFields(): array + { + return []; + } private function auditMask(?array $row): ?array { @@ -106,9 +111,10 @@ trait Auditable $changes = is_array($eventData['data'] ?? null) ? $eventData['data'] : []; // 지정 필드만 변경된 경우(로그인/세션 갱신 등) → 기록 생략 - if ($this->auditSkipUpdateOnlyFields !== [] && $changes !== []) { + $skipOnly = $this->auditSkipUpdateOnlyFields(); + if ($skipOnly !== [] && $changes !== []) { $changedKeys = array_values(array_diff(array_keys($changes), [$this->primaryKey])); - if ($changedKeys !== [] && array_diff($changedKeys, $this->auditSkipUpdateOnlyFields) === []) { + if ($changedKeys !== [] && array_diff($changedKeys, $skipOnly) === []) { $this->auditBeforeRows = []; return $eventData;