daemon-idc init

This commit is contained in:
최준흠 2026-03-02 12:08:36 +09:00
parent 209b86180c
commit e0ab286a26

View File

@ -1,19 +1,10 @@
<?php <?php
// =========================================================
// AbstractCRUDController.php (FINAL)
// - 모든 "결과/리다이렉트"는 RedirectResponse|ResponseInterface로 엄격 정리
// - create/modify/delete/view/create_form/modify_form 모두 runAction 적용
// - delete_result_process도 정책에 맞게 RedirectResponse|ResponseInterface로 정리
// =========================================================
namespace App\Controllers; namespace App\Controllers;
use RuntimeException;
use Psr\Log\LoggerInterface;
use App\Entities\CommonEntity; use App\Entities\CommonEntity;
use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\RequestInterface; use RuntimeException;
use CodeIgniter\HTTP\ResponseInterface;
/** /**
* AbstractCRUDController * AbstractCRUDController
@ -21,209 +12,169 @@ use CodeIgniter\HTTP\ResponseInterface;
*/ */
abstract class AbstractCRUDController extends AbstractWebController abstract class AbstractCRUDController extends AbstractWebController
{ {
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) // 💡 핵심 1: 각 자식 클래스가 사용할 Entity 클래스 경로를 반환하도록 강제
{ // 이 메서드는 자식 클래스에서 반드시 구현되어야 합니다.
parent::initController($request, $response, $logger); // --- 생성 (Create) ---
}
// =========================================================
// CRUD 공통 보조
// =========================================================
protected function assertUid($uid, string $action): void
{
if (!$uid) {
throw new RuntimeException(static::class . '->' . $action . "에서 {$this->getTitle()}에 번호가 정의 되지 않았습니다.");
}
}
protected function assertEntityClass(CommonEntity $entity, string $action): void
{
$entityClass = $this->service->getEntityClass();
if (!$entity instanceof $entityClass) {
throw new RuntimeException(static::class . '->' . $action . "에서 오류발생:Return Type은 {$entityClass}만 가능");
}
}
protected function buildViewRedirectUrl(CommonEntity $entity): string
{
return '/' . implode('/', [...$this->getActionPaths(), 'view']) . '/' . $entity->getPK();
}
protected function buildListRedirectUrl(): string
{
return implode(DIRECTORY_SEPARATOR, $this->getActionPaths());
}
// =========================================================
// Create Form
// =========================================================
protected function create_form_process(array $formDatas = []): array protected function create_form_process(array $formDatas = []): array
{ {
return $this->request->getVar(); //초기 기본 Default값 지정
$formDatas = $this->request->getVar();
return $formDatas;
} }
public function create_form(): string|RedirectResponse|ResponseInterface protected function create_form_result_process(string $action): string|RedirectResponse
{ {
$action = __FUNCTION__; return $this->action_render_process($action, $this->getViewDatas(), $this->request->getVar('ActionTemplate'));
}
return $this->runAction($action, function () use ($action) { public function create_form(): string|RedirectResponse
{
try {
$action = __FUNCTION__;
$formDatas = $this->create_form_process(); $formDatas = $this->create_form_process();
$this->action_init_process($action, $formDatas); $this->action_init_process($action, $formDatas);
$this->addViewDatas('formDatas', $formDatas); $this->addViewDatas('formDatas', $formDatas);
return $this->action_render_process($action, $this->getViewDatas(), $this->request->getVar('ActionTemplate')); return $this->create_form_result_process($action);
}); } catch (\Throwable $e) {
return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 생성폼 오류:" . $e->getMessage());
}
} }
// =========================================================
// Create
// =========================================================
protected function create_process(array $formDatas): CommonEntity protected function create_process(array $formDatas): CommonEntity
{ {
return $this->service->create($formDatas); return $this->service->create($formDatas);
} }
final public function create(): RedirectResponse|ResponseInterface|string protected function create_result_process($entity, ?string $redirect_url = null): string|RedirectResponse
{ {
$action = __FUNCTION__; return $this->action_redirect_process(
'info',
return $this->runAction($action, function () use ($action) { "{$this->getTitle()}에서 {$entity->getTitle()} 생성이 완료되었습니다.",
$this->action_init_process($action); $redirect_url ?? '/' . implode('/', [...$this->getActionPaths(), 'view']) . '/' . $entity->getPK()
);
$entity = $this->create_process($this->request->getPost());
$this->assertEntityClass($entity, $action);
$message = "{$this->getTitle()}에서 {$entity->getTitle()} 생성이 완료되었습니다.";
return $this->okResponse($message, ['id' => $entity->getPK()], $this->buildViewRedirectUrl($entity));
});
} }
// ========================================================= final public function create(): string|RedirectResponse
// Modify Form {
// ========================================================= try {
$action = __FUNCTION__;
$this->action_init_process($action);
$entity = $this->create_process($this->request->getPost());
// 💡 동적으로 가져온 Entity 클래스 이름으로 instanceof 검사
$entityClass = $this->service->getEntityClass();
if (!$entity instanceof $entityClass) {
throw new RuntimeException(static::class . '->' . __FUNCTION__ . "에서 오류발생:Return Type은 {$entityClass}만 가능");
}
return $this->create_result_process($entity);
} catch (\Throwable $e) {
return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 생성 오류:" . $e->getMessage());
}
}
// --- 수정 (Modify) ---
protected function modify_form_process($uid): CommonEntity protected function modify_form_process($uid): CommonEntity
{ {
return $this->service->getEntity($uid); return $this->service->getEntity($uid);
} }
protected function modify_form_result_process(string $action): string protected function modify_form_result_process(string $action): string|RedirectResponse
{ {
return $this->action_render_process($action, $this->getViewDatas(), $this->request->getVar('ActionTemplate')); return $this->action_render_process($action, $this->getViewDatas(), $this->request->getVar('ActionTemplate'));
} }
final public function modify_form($uid): string|RedirectResponse|ResponseInterface final public function modify_form($uid): string|RedirectResponse
{ {
$action = __FUNCTION__; try {
if (!$uid) {
return $this->runAction($action, function () use ($action, $uid) { throw new RuntimeException(static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()}에 번호가 정의 되지 않았습니다.");
$this->assertUid($uid, $action); }
$entity = $this->modify_form_process($uid); $entity = $this->modify_form_process($uid);
$this->addViewDatas('entity', $entity); $this->addViewDatas('entity', $entity);
$action = __FUNCTION__;
//FormService에서 필요한 기존 데이터를 $entity에서 추출해서 넘김
$this->action_init_process($action, $entity->toArray()); $this->action_init_process($action, $entity->toArray());
return $this->modify_form_result_process($action); return $this->modify_form_result_process($action);
}); } catch (\Throwable $e) {
return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 수정폼 오류:" . $e->getMessage());
}
} }
// =========================================================
// Modify
// =========================================================
protected function modify_process($uid, array $formDatas): CommonEntity protected function modify_process($uid, array $formDatas): CommonEntity
{ {
return $this->service->modify($uid, $formDatas); return $this->service->modify($uid, $formDatas);
} }
/** protected function modify_result_process($entity, ?string $redirect_url = null): string|RedirectResponse
* 기본 결과 처리 (필요시 자식에서 override)
*/
protected function result_process(CommonEntity $entity, string $message): RedirectResponse|ResponseInterface
{ {
return $this->okResponse($message, ['id' => $entity->getPK()], $this->buildViewRedirectUrl($entity)); return $this->action_redirect_process(
'info',
"{$this->getTitle()}에서 {$entity->getTitle()} 수정이 완료되었습니다.",
$redirect_url ?? '/' . implode('/', [...$this->getActionPaths(), 'view']) . '/' . $entity->getPK()
);
} }
final public function modify($uid): string|RedirectResponse
final public function modify($uid): string|RedirectResponse|ResponseInterface
{ {
$action = __FUNCTION__; try {
if (!$uid) {
return $this->runAction($action, function () use ($action, $uid) { throw new RuntimeException(static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()}에 번호가 정의 되지 않았습니다.");
$this->assertUid($uid, $action); }
$action = __FUNCTION__;
$this->action_init_process($action); $this->action_init_process($action);
$entity = $this->modify_process($uid, $this->request->getPost()); $entity = $this->modify_process($uid, $this->request->getPost());
$this->assertEntityClass($entity, $action);
$this->addViewDatas('entity', $entity); $this->addViewDatas('entity', $entity);
return $this->result_process($entity, "{$this->getTitle()}에서 {$entity->getTitle()} 수정이 완료되었습니다."); return $this->modify_result_process($entity);
}); } catch (\Throwable $e) {
return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 수정 오류:" . $e->getMessage());
}
} }
// ========================================================= // --- 삭제 (Delete) ---
// Delete
// =========================================================
protected function delete_process($uid): CommonEntity protected function delete_process($uid): CommonEntity
{ {
return $this->service->delete($uid); return $this->service->delete($uid);
} }
protected function delete_result_process($entity, ?string $redirect_url = null): string|RedirectResponse
protected function delete_result_process(CommonEntity $entity, ?string $redirect_url = null): RedirectResponse|ResponseInterface
{ {
// AJAX면 action_redirect_process가 JSON으로 자동 변환
$redirect_url = $redirect_url ?? $this->buildListRedirectUrl();
return $this->action_redirect_process('info', "{$this->getTitle()}에서 {$entity->getTitle()} 삭제가 완료되었습니다.", $redirect_url); return $this->action_redirect_process('info', "{$this->getTitle()}에서 {$entity->getTitle()} 삭제가 완료되었습니다.", $redirect_url);
} }
final public function delete($uid): RedirectResponse
final public function delete($uid): RedirectResponse|ResponseInterface|string
{ {
$action = __FUNCTION__; try {
if (!$uid) {
return $this->runAction($action, function () use ($action, $uid) { throw new RuntimeException(static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()}에 번호가 정의 되지 않았습니다.");
$this->assertUid($uid, $action); }
$entity = $this->service->getEntity($uid);
$this->action_init_process($action); //Delete처리
// 삭제 전 존재 확인(기존 로직 유지)
$this->service->getEntity($uid);
$entity = $this->delete_process($uid); $entity = $this->delete_process($uid);
$this->assertEntityClass($entity, $action);
return $this->delete_result_process($entity); return $this->delete_result_process($entity);
}); } catch (\Throwable $e) {
return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 삭제 오류:" . $e->getMessage());
}
} }
// ========================================================= // --- 상세보기 (View) ---
// View
// =========================================================
protected function view_process($uid): CommonEntity protected function view_process($uid): CommonEntity
{ {
return $this->service->getEntity($uid); return $this->service->getEntity($uid);
} }
protected function view_result_process(string $action): string protected function view_result_process(string $action): string
{ {
return $this->action_render_process($action, $this->getViewDatas(), $this->request->getVar('ActionTemplate')); return $this->action_render_process($action, $this->getViewDatas(), $this->request->getVar('ActionTemplate'));
} }
final public function view($uid): string|RedirectResponse
final public function view($uid): string|RedirectResponse|ResponseInterface
{ {
$action = __FUNCTION__; try {
if (!$uid) {
return $this->runAction($action, function () use ($action, $uid) { throw new RuntimeException(static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()}에 번호가 정의 되지 않았습니다.");
$this->assertUid($uid, $action); }
//View처리
$entity = $this->view_process($uid); $entity = $this->view_process($uid);
$action = __FUNCTION__;
//FormService에서 필요한 기존 데이터를 $entity에서 추출해서 넘김
$this->action_init_process($action, $entity->toArray()); $this->action_init_process($action, $entity->toArray());
$this->addViewDatas('entity', $entity); $this->addViewDatas('entity', $entity);
return $this->view_result_process($action); return $this->view_result_process($action);
}); } catch (\Throwable $e) {
return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 상세보기 오류:" . $e->getMessage());
}
} }
} }