trafficmonitor init...2

This commit is contained in:
choi.jh 2025-11-14 17:41:28 +09:00
parent 17d99cfe29
commit 85ea196abc

View File

@ -14,7 +14,6 @@ abstract class CommonModel extends Model
protected $useSoftDeletes = false;
protected $protectFields = true;
protected $allowedFields = [];
protected bool $allowEmptyInserts = false;
protected bool $updateOnlyChanged = true;
@ -36,9 +35,9 @@ abstract class CommonModel extends Model
// Callbacks
protected $allowCallbacks = true;
protected $beforeInsert = [];
protected $beforeInsert = ['_cleanNullsForDefaults']; //Field 값이 NULL일 경우 DB Default값 적용용
protected $afterInsert = [];
protected $beforeUpdate = [];
protected $beforeUpdate = ['_cleanNullsForDefaults']; //Field 값이 NULL일 경우 DB Default값 적용용
protected $afterUpdate = [];
protected $beforeFind = [];
protected $afterFind = [];
@ -64,104 +63,24 @@ abstract class CommonModel extends Model
{
return $this->useAutoIncrement;
}
/**
* Entity 삽입을 처리하고, $useAutoIncrement가 false일 경우 UUID를 자동으로 생성합니다.
* @param object|array $data Entity 객체 또는 데이터 배열
* @param bool $returnID 삽입 ID를 반환할지 여부 (자동 증가 키일 경우 true)
* @return bool|int|string
*/
public function insert($data = null, bool $returnID = true)
{
// 1. 공통 전처리 로직 (예: 모든 모델에 대한 로그 기록, 공통 필드 설정 등)
$data = $this->preProcessData($data);
// 2. PK 자동 할당 로직
if (!$this->useAutoIncrement) {
$data = $this->ensurePrimaryKey($data);
// 이 훅은 save() 메서드 실행 시 자동으로 호출됩니다.
protected function _cleanNullsForDefaults(array $data): array
{
// $data['data'] 배열에 실제 INSERT/UPDATE 될 데이터가 들어있습니다.
if (!isset($data['data']) || !is_array($data['data'])) {
return $data;
}
// 3. BaseModel의 insert 호출
// 문자열 PK일 경우, $returnID를 false로 넘겨서 ID 반환을 강제하지 않는 것이 좋습니다.
$baseReturn = parent::insert($data, $this->useAutoIncrement);
// 4. 후처리 및 반환
if ($this->useAutoIncrement) {
// 정수 PK: BaseModel이 반환한 새로운 ID를 그대로 반환
return $baseReturn;
} else {
// 문자열 PK: BaseModel의 insert는 성공 시 true/1을 반환. true로 통일하여 반환
return $baseReturn !== false;
}
}
/**
* Entity나 데이터 배열을 받아서 필요하다면 Primary Key를 생성하여 할당합니다.
* @param object|array $data
* @return object|array
*/
protected function ensurePrimaryKey($data)
{
$pkName = $this->primaryKey;
$entityData = is_object($data) ? $data->attributes : (array) $data;
// PK가 설정되어 있지 않은 경우
if (empty($entityData[$pkName])) {
$newUuid = service('uuid')->uuid4()->toString();
if (is_object($data)) {
// Entity 객체일 경우 __set()을 통해 Setter를 호출하며 할당
$data->$pkName = $newUuid;
} else {
// 배열일 경우 배열에 할당
$data[$pkName] = $newUuid;
// 데이터 배열을 순회하며 값이 null인 필드를 제거합니다.
foreach ($data['data'] as $key => $value) {
// 이 필드가 Primary Key가 아니면서 (PK는 Update 시 필요)
// 값이 null이면 DB에 명시하지 않도록 배열에서 제거합니다.
if ($key !== $this->primaryKey && $value === null) {
unset($data['data'][$key]);
}
}
return $data;
}
/**
* 모든 삽입/수정 작업 공통 로직을 처리하는 확장 지점.
*/
protected function preProcessData($data)
{
// 예: $data['data']['updated_by'] = session('user_id');
return $data;
}
// ******************************************************
// 2. UPDATE 및 DELETE 확장
// ******************************************************
/**
* BaseModel의 update 메서드를 호출하기 /후에 공통 로직을 적용하는 확장 지점.
* @param array|int|string|null $id
* @param array|object|null $data
* @return bool
*/
public function update($id = null, $data = null): bool
{
// 1. 업데이트 전 공통 로직 (preUpdate 이벤트)
$data = $this->preProcessData($data);
// 2. BaseModel의 update 호출
return parent::update($id, $data);
// 3. 업데이트 후 공통 로직 (postUpdate 이벤트)
}
/**
* BaseModel의 delete 메서드를 호출하기 /후에 공통 로직을 적용하는 확장 지점.
* @param array|int|string|null $id
* @param bool $purge
* @return bool
*/
public function delete($id = null, bool $purge = false): bool
{
// 1. 삭제 전 공통 로직 (preDelete 이벤트)
// 2. BaseModel의 delete 호출
return parent::delete($id, $purge);
// 3. 삭제 후 공통 로직 (postDelete 이벤트)
}
}