dbmsv2/app/Services/CommonService.php
2025-09-16 18:47:48 +09:00

368 lines
12 KiB
PHP

<?php
namespace App\Services;
use App\Entities\FormOptionEntity;
use App\Models\CommonModel;
use App\Helpers\CommonHelper;
abstract class CommonService
{
private $_myAuth = null;
private $_model = null;
private $_helper = null;
private $_classNames = [];
private $_control = [];
protected function __construct(CommonModel $model, CommonHelper $helper)
{
$this->_model = $model;
$this->_helper = $helper;
}
abstract public function getFormFields(): array;
abstract public function getFormFilters(): array;
final public function getMyAuth(): mixed
{
if (!$this->_myAuth) {
$this->_myAuth = service('myauth');
}
return $this->_myAuth;
}
final public function getHelper(): mixed
{
if (!$this->_helper) {
throw new \Exception("Helper가 정의되지 않았습니다. " . __METHOD__);
}
return $this->_helper;
}
final public function getControlDatas(?string $key = null): string|array
{
if (!$key) {
return $this->_control;
}
return array_key_exists($key, $this->_control) ? $this->_control[$key] : [];
}
final public function setControlDatas(string $key, mixed $values): void
{
if (!array_key_exists($key, $this->_control)) {
$this->_control[$key] = [];
}
$this->_control[$key] = $values;
}
final protected function getModel(): mixed
{
if (!$this->_model) {
throw new \Exception("Model이 정의되지 않았습니다. " . __METHOD__);
}
return $this->_model;
}
final protected function addClassName(string $className): void
{
$this->_classNames[] = $className;
}
final public function getClassName($delimeter = DIRECTORY_SEPARATOR): string
{
return implode($delimeter, $this->_classNames);
}
final public function setAction(string $action): void
{
$this->setControlDatas('action', $action);
}
final public function getAction(): string
{
if (!$this->getControlDatas('action')) {
throw new \Exception("action이 정의되지 않았습니다.");
}
return $this->getControlDatas('action');
}
//FormFields정의
final public function setFormFields(?array $fields = null): void
{
switch ($this->getAction()) {
case 'index':
$actionFields = $this->getIndexFields();
break;
case 'view':
$actionFields = $this->getViewFields();
break;
default:
$actionFields = $this->getFormFields();
break;
}
$this->setControlDatas('actionFields', is_array($fields) ? $fields : $actionFields);
}
final public function setFormFilters(?array $filters = null): void
{
switch ($this->getAction()) {
case 'index':
$actionFilters = $this->getIndexFilters();
break;
case 'view':
$actionFilters = $this->getViewFilters();
break;
default:
$actionFilters = $this->getFormFilters();
break;
}
$this->setControlDatas('actionFilters', is_array($filters) ? $filters : $actionFilters);
}
//FormRules정의
final public function getFormRules(array $rules = []): array
{
foreach ($this->getControlDatas('field_rules') as $field => $rule) {
$rules[$field] = $rule;
}
return $rules;
}
final public function setFormRules(): void
{
$rules = [];
foreach ($this->getControlDatas('actionFields') as $field) {
$rules[$field] = $this->getFormRule($this->getAction(), $field);
}
$this->setControlDatas('field_rules', $rules);
}
//FormOptions정의
final protected function getFormOptions(array $options = []): array
{
foreach ($this->getControlDatas('field_optons') as $field => $option) {
$options[$field] = $option;
}
return $options;
}
final public function setFormOptions(): void
{
//기존 Filter Options 가져와서 field에 해당하는 option이 없으면 field를 key로 배열추가 후 다시 filter_options 전체 적용
$options = [];
foreach ($this->getControlDatas('actionFilters') as $field) {
$options[$field] = $this->getFormOption($field, $options);
}
$this->setControlDatas('field_optons', $options);
}
//Entity별로 작업처리시
protected function getEntity_process(object $entity): mixed
{
return $entity;
}
final public function getEntity(mixed $where, ?string $message = null): mixed
{
try {
$entity = is_array($where) ? $this->getModel()->where($where)->first() : $this->getModel()->find($where);
if (!$entity) {
return null;
}
return $this->getEntity_process($entity);
} catch (\Exception $e) {
$message = sprintf(
"\n------%s SQL오류-----<BR>\n%s<BR>\n%s<BR>\n------------------------------\n",
__FUNCTION__,
$this->getModel()->getLastQuery(),
$e->getMessage()
);
throw new \Exception($message);
}
}
//entities를 가져오는 조건
protected function getEntities_process(mixed $where = null, array $columns = ['*']): array
{
if ($where) {
$this->getModel()->where($where);
}
//출력순서 정의
$this->setOrderBy();
$entities = [];
foreach ($this->getModel()->select(implode(',', $columns))->findAll() as $entity) {
$entities[$entity->getPK()] = $this->getEntity_process($entity);
}
$debug = sprintf("debug.%s.%s", str_replace("\\", ".", get_class($this)), __FUNCTION__);
if (env($debug, false)) {
echo $debug . "=>" . $this->getModel()->getLastQuery() . "<BR>";
}
return $entities;
}
final public function getEntities(mixed $where = null, array $columns = ['*']): array
{
try {
$entities = $this->getEntities_process($where, $columns);
$debug = sprintf("debug.%s.%s", str_replace("\\", ".", get_class($this)), __FUNCTION__);
if (env($debug, false)) {
echo $this->getModel()->getLastQuery() . "<BR>";
}
return $entities;
} catch (\Exception $e) {
$message = sprintf(
"\n------%s SQL오류-----<BR>\n%s<BR>\n%s<BR>\n------------------------------\n",
__FUNCTION__,
$this->getModel()->getLastQuery(),
$e->getMessage()
);
throw new \Exception($message);
}
} //
final public function getFormDatas(): array
{
return $this->getControlDatas('form_datas');
}
final public function setFormDatas(array $requestDatas, array $formDatas = []): void
{
foreach ($this->getControlDatas('actionFields') as $field) {
$formDatas = $this->setFormData($field, $requestDatas, $formDatas);
}
$this->setControlDatas('form_datas', $formDatas);
}
//기본 기능부분
//FieldForm관련용
public function getViewFields(): array
{
return $this->getFormFields();
}
public function getViewFilters(): array
{
return $this->getFormFilters();
}
public function getIndexFields(): array
{
return $this->getFormFields();
}
public function getIndexFilters(): array
{
return $this->getFormFilters();
}
public function getBatchjobFields(): array
{
return $this->getIndexFilters();
}
public function getBatchjobButtons(): array
{
return [
'batchjob' => '일괄 처리',
'batchjob_delete' => '일괄 삭제',
];
}
public function getFormOption(string $field, array $options = []): array
{
switch ($field) {
default:
$options = lang($this->getClassName() . '.' . strtoupper($field));
break;
}
if (!is_array($options)) {
throw new \Exception(__FUNCTION__ . "에서 {$field}의 options 값이 array가 아닙니다.\n" . var_export($options, true));
}
return $options;
}
public function getFormRule(string $action, string $field): string
{
if (is_array($field)) {
throw new \Exception(__FUNCTION__ . "=> field가 array 입니다.\n" . var_export($field, true));
}
switch ($field) {
default:
$rule = $this->getModel()->getFormRule($action, $field);
break;
}
return $rule;
}
public function setFormData(string $field, array $requestDatas, array $formDatas): array
{
switch ($field) {
default:
$formDatas[$field] = $requestDatas[$field] ?? null;
break;
}
return $formDatas;
}
//생성
public function create(array $formDatas): mixed
{
$entity = $this->getModel()->create($formDatas);
// LogCollector::info("[{$entity->getTitle()}]" . MESSAGES["CREATED"] . ":");
return $entity;
}
//수정
public function modify(mixed $entity, array $formDatas): mixed
{
$entity = $this->getModel()->modify($entity, $formDatas);
// LogCollector::info("[{$entity->getTitle()}]" . MESSAGES["UPDATED"] . ":");
return $entity;
}
//단일작업
public function toggle(mixed $entity, array $formDatas): mixed
{
$entity = $this->getModel()->modify($entity, $formDatas);
// LogCollector::info("[{$entity->getTitle()}]" . MESSAGES["UPDATED"] . ":");
return $entity;
}
//일괄처리작업
public function batchjob(mixed $entity, array $formDatas): mixed
{
$entity = $this->getModel()->modify($entity, $formDatas);
// LogCollector::info("[{$entity->getTitle()}]" . MESSAGES["UPDATED"] . ":");
return $entity;
}
//삭제
public function delete(mixed $entity): mixed
{
try {
$message = "[{$entity->getTitle()}]" . MESSAGES["DELETED"] . ":";
$result = $this->getModel()->delete($entity->getPK());
if (!$result) {
throw new \Exception($message);
}
// LogCollector::info($message);
return $entity;
} catch (\Exception $e) {
$message = sprintf(
"\n------%s SQL오류-----<BR>\n%s<BR>\n%s<BR>\n------------------------------\n",
__FUNCTION__,
$this->getModel()->getLastQuery(),
$e->getMessage()
);
throw new \Exception($message);
}
}
////Index 검색용
//Index용
final public function getTotalCount(): int
{
return $this->getModel()->countAllResults(false);
}
//Limit처리
final public function setLimit(int $per_page): void
{
$this->getModel()->limit($per_page);
}
//Offset처리
final public function setOffset(int $offset): void
{
$this->getModel()->offset($offset);
}
//FormFilter 조건절 처리
public function index_condition_filterField(string $field, mixed $filter_value): void
{
switch ($field) {
default:
$this->getModel()->where("{$this->getModel()->getTable()}.{$field}", $filter_value);
break;
}
}
//검색어조건절처리
public function index_condition_filterWord(string $word): void
{
$this->getModel()->orLike($this->getModel()->getTable() . "." . $this->getModel()->getTitleField(), $word, 'both');
}
//날자검색
public function index_condition_filterDate(string $start, string $end): void
{
$this->getModel()->where(sprintf("%s.created_at >= '%s 00:00:00'", $this->getModel()->getTable(), $start));
$this->getModel()->where(sprintf("%s.created_at <= '%s 23:59:59'", $this->getModel()->getTable(), $end));
}
//OrderBy 처리
public function setOrderBy(mixed $field = null, mixed $value = null): void
{
if ($field !== null && $value !== null) {
$this->getModel()->orderBy(sprintf("%s.%s %s", $this->getModel()->getTable(), $field, $value));
}
}
}