getFieldRule($action, $field); } return $rules; } public function getFieldRule(string $action, string $field): string { if (is_array($field)) { throw new \Exception(__FUNCTION__ . "=> field가 array 입니다.\n" . var_export($field, true)); } switch ($field) { case $this->getPKField(): // 수동입력인 경우 if (!$this->useAutoIncrement) { $rule = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]"; $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->table}.{$field}]" : ""; } else { $rule = "required|numeric"; } break; case $this->getTitleField(): $rule = "required|string"; break; case 'image': $rule = "is_image[{$field}]|mime_in[{$field},image/jpg,image/jpeg,image/gif,image/png,image/webp]|max_size[{$field},300]|max_dims[{$field},2048,768]"; break; case "status": $rule = "if_exist|in_list[use,unuse]"; break; case "updated_at": case "created_at": case "deleted_at": $rule = "if_exist|valid_date"; break; default: $rule = "if_exist|string"; break; } return $rule; } // create, modify 직전 작업용 작업 protected function convertEntityData(string $field, array $formDatas): mixed { switch ($field) { case $this->getPKField(): // $formDatas에 전달된 값이 없는 경우 if (!array_key_exists($field, $formDatas)) { $randomBytes = bin2hex(random_bytes(32)); $value = sprintf( '%08s-%04s-%04x-%04x-%12s', substr($randomBytes, 0, 8), substr($randomBytes, 8, 4), substr($randomBytes, 12, 4), substr($randomBytes, 16, 4), substr($randomBytes, 20, 12) ); } else { $value = $formDatas[$field]; } break; case "editor": // content 등 textarea를 사용한 Field $value = htmlentities($formDatas[$field], ENT_QUOTES); break; default: $value = $formDatas[$field]; break; } return $value; } private function save_process($entity): mixed { // 최종 변경사항이 없으면 if (!$entity->hasChanged()) { return $entity; } // 최종 저장 시 오류 발생하면 if (!$this->save($entity)) { $message = sprintf( "\n------%s 오류-----\n%s\n%s\n------------------------------\n", __FUNCTION__, $this->getLastQuery(), var_export($this->errors(), true) ); LogCollector::error($message); throw new \Exception($message); } return $entity; } public function create(array $formDatas, mixed $entity): mixed { // Field에 맞는 Validation Rule 재정의 $this->setValidationRules($this->getFieldRules('create', $this->allowedFields)); // 저장하기 전에 데이터 값 변경이 필요한 Field foreach (array_keys($formDatas) as $field) { LogCollector::debug("{$field}:{$formDatas[$field]}"); $entity->$field = $this->convertEntityData($field, $formDatas); } // dd($entity); $entity = $this->save_process($entity); // primaryKey가 자동입력이면 if ($this->useAutoIncrement) { $pkField = $this->getPKField(); $entity->$pkField = $this->getInsertID(); } // log_message("debug", $this->getTable() . " => " . __FUNCTION__ . " DB 작업 완료"); return $entity; } public function modify(mixed $entity, array $formDatas): mixed { // Field에 맞는 Validation Rule 재정의 $this->setValidationRules($this->getFieldRules('modify', $this->allowedFields)); // 저장하기 전에 데이터 값 변경이 필요한 Field LogCollector::debug("[{$entity->getPK()}/{$entity->getTitle()}] 변경내용"); foreach (array_keys($formDatas) as $field) { LogCollector::debug("{$field}/{$entity->$field}=>{$formDatas[$field]}"); $entity->$field = $this->convertEntityData($field, $formDatas); } return $this->save_process($entity); } //List관련 final public function setList_FieldFilter(string $field, int|string $value): void { $this->where($this->getTable() . '.' . $field, $value); } final public function setList_DateFilter(string $start, string $end, $field = "created_at"): void { if ($start !== DEFAULTS['EMPTY']) { $this->where($this->getTable() . ".{$field} >= '{$start} 00:00:00'"); } if ($end !== DEFAULTS['EMPTY']) { $this->where($this->getTable() . ".{$field} <= '{$end} 23:59:59'"); } } }