[최신글 6/13] 사용 예제 ③ 권한 지키기와 캐시 — DXCMS
키워드: 권한, read_level, 비공개 게시판, 캐시, DxCache, 훅, dx_after_write 표기: (소스)=코드 확인·실행 검증, (README)=README 기재, (일반)=일반 지식
최신글 함수는 열람 권한을 확인하지 않습니다(7/13). 회원 전용·관리자 전용 게시판을 쓴다면 아래 함수로 감싸세요.
권한 확인 (코어와 같은 규칙)
read_level: 0=전체, 1=로그인 회원, 9=관리자, 그 외 값은 코어도 통과시킵니다. (소스)
function my_can_read($boardKey)
{
$db = Database::getInstance();
$b = $db->row("SELECT read_level FROM `{$db->table('boards')}` WHERE board_key=? AND status=1", array($boardKey));
if (!$b) return false;
$lv = (int)$b['read_level'];
if ($lv === 1) return dx_is_login();
if ($lv === 9) return dx_is_admin();
return true;
}
권한을 지키는 최신글 출력
function my_latest($boardKey, $limit = 5, $skin = 'list', $title = '', $icon = '')
{
if (my_can_read($boardKey)) dx_board_latest($boardKey, $limit, $skin, $title, $icon);
}
사용:
- 실행 확인: 비로그인은 빈 출력, 회원은 read_level 1 게시판 출력, 관리자만 read_level 9 게시판 출력
캐시 60초 (DxCache)
function my_latest_cached($boardKey, $limit = 5, $ttl = 60)
{
if (!my_can_read($boardKey)) return array();
$ck = 'my_latest:' . $boardKey . ':' . (int)$limit;
$rows = DxCache::get($ck, null);
if (!is_array($rows)) {
$rows = dx_board_posts($boardKey, $limit);
DxCache::set($ck, $rows, $ttl);
}
return $rows;
}
- DxCache 는 Redis → APCu → 파일(data/cache) 순서로 자동 선택됩니다. (소스)
- 캐시 값은 권한 확인 뒤에 사용되므로 비공개 게시판이 새지 않습니다.
글 저장 시 캐시 삭제 (훅)
dx_add_hook('dx_after_write', function ($a) {
DxCache::deletePrefix('my_latest:' . $a['board']['board_key'] . ':');
});
- 실행 확인: 글 제목을 바꾼 뒤에도 캐시는 이전 제목을 보여 주다가, 훅 실행 후 새 제목이 나옵니다.
- 글 삭제는 이 훅 대상이 아니므로 60초 만료에 맡깁니다.
다음: 7/13 주의사항