질문/조언질답게시판
Extra Form
PHP PHP 8.1
CMS Rhymix 2.x

안녕하세요!

오늘도 열심히 모듈을 제작해보고 있는데, 궁금한점이 생겨서 문의드립니다.

 

포인트 모듈의 set_point 함수에는 아래와같이 before트리거가 끼어들 수 있도록 되어있더라구요!

// Call a trigger (before)
$trigger_obj = new stdClass();
$trigger_obj->member_srl = $args->member_srl;
$trigger_obj->mode = $mode;
$trigger_obj->current_point = $current_point;
$trigger_obj->current_level = $current_level;
$trigger_obj->set_point = $point;
$trigger_output = ModuleHandler::triggerCall('point.setPoint', 'before', $trigger_obj);
if(!$trigger_output->toBool())
{
return $trigger_output;
}

그래서 저기있는 before트리거에서, 어떤 조건을 만족할 경우 증가 또는 감소하는 포인트의 양 자체를 조작하려고 하는데요

 

제가 이해한 바로는 point.setPoint 의 before 트리거에서는 $trigger_obj 을 통해 인자로 전달된 값만 사용할 수 있고

포인트 모듈에서 해당 트리거를 불러오는 쪽의 변수 $args->point 를 건들이지는 못하는것 같더라구요

 

혹시 $args->point값 (포인트 모듈에서 트리거를 호출 후, 쿼리 실행시 사용)을 트리거에서 조작하는 방법이 있을까요?

  • profile

    현재로서는 안 되는 것 같습니다.

     

    보통 $trigger_obj는 레퍼런스로 전달되기 때문에 특별히 뭘 반환하지 않아도 그냥 조작하면 조작한 결과를 인식하도록 구현되는데, 특이하게 저기서는 $trigger_obj를 무시하고 원래 $args로 넘어왔던 값을 그대로 DB에 넣고 있네요.

     

    원하시는 방식으로 구현하려면 after 트리거에서 따로 포인트를 추가해 주어야 할 것 같습니다. 예를 들어 5포인트를 주는 상황인데 10포인트로 변경하고 싶다면 after에서 따로 5포인트를 주는 거죠... 단, 추가 포인트 부여시에도 똑같이 트리거가 호출되므로 의도치 않은 재귀함수가 되어 버려서 포인트가 무한히 늘어나지 않도록 신경써야겠습니다.

     

    사실 지금처럼 PHP단에서 포인트를 더하거나 뺀 후에 그 결과값만 DB로 넘기는 방식은 동시에 여러 가지 변화가 일어날 경우 결과가 안 맞는 문제가 생길 수 있습니다. 현재 상태에서 트리거 기능만 강화한다면 이 문제가 더 심해질 가능성이 있고요. DB단에서 상대값으로 +5, -10 등을 직접 적용하도록 (예: SET point = point + 5) 개선한 후에 트리거 기능을 강화하는 순서로 진행해야겠습니다.

  • profile profile
    방금 단, 추가 포인트 부여시에도 똑같이 트리거가 호출되므로 의도치 않은 재귀함수가 되어 버려서 포인트가 무한히 늘어나지 않도록 신경써야겠습니다.<--- 이러한 일이 실제로 발생했고, 서버가 뻗어버렸습니다.... ㅋㅋㅋㅋㅋㅋ

    after 트리거를 사용하면 되겠다고, 나는 천재 아니냐면서 열심히 만들었는데 결국에는 ...

    감사합니다 ㅋㅋㅋ
  • profile profile
    혹시 재귀적으로 무한히 포인트를 증가시키는것을 막으려면, 조건문을통해 그때에만 트리거를 실행하지 않도록 해야할 것 같은데요
    혹시 이때는 세션을 이용하면 좋을까요? 아니면 context Set 을 이용하는게 좋을까요? ㅠㅠ

    php를 처음부터 배운게 아니라 기초가 많이 부족한것 같네요 ㅠㅠㅠ
  • profile profile

    특정 자료 내에서만 사용하는 데이터를 굳이 세션이나 Context 등 전역으로 빼낼 필요는 없을 것 같습니다. 이미 포인트를 부여했는지 기억하는 변수는 트리거를 받는 함수 내에서 static 변수로 관리하셔도 되고, 클래스에 소속된 메소드라면 클래스 속성으로 관리하셔도 됩니다. 예: $this->already_called = true;

  • profile profile
    감사합니다!!