BoardTrait.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. namespace App\Http\Traits;
  3. use App\Models\BoardMeta;
  4. use App\Models\DTO\SearchData;
  5. trait BoardTrait
  6. {
  7. /**
  8. * 게시판 설정 값 조회
  9. */
  10. protected function boardMeta(int $boardID): ?BoardMeta
  11. {
  12. return (new BoardMeta)->getAllMeta($boardID);
  13. }
  14. /**
  15. * 시간을 하루 기준으로 시분초 또는 일자로 노출
  16. */
  17. protected function shortDate($dateAt): string
  18. {
  19. return (round((time() - strtotime($dateAt)) / 86400) >= 1 ? date('Y.m.d', strtotime($dateAt)) : date('H:i', strtotime($dateAt)));
  20. }
  21. /**
  22. * 게시판 Querys 주소 생성
  23. */
  24. protected function queryString(?SearchData $params = null)
  25. {
  26. parse_str(request()->getQueryString(), $queryString);
  27. return ('?' . (http_build_query([
  28. 'page' => ($queryString['page'] ?? $params->page ?? 1),
  29. 'per_page' => ($queryString['per_page'] ?? $params->perPage ?? null),
  30. 'sort' => ($queryString['sort'] ?? $params->sort ?? null),
  31. 'category' => ($queryString['category'] ?? $params->category ?? null),
  32. 'field' => ($queryString['field'] ?? $params->field ?? null),
  33. 'keyword' => ($queryString['keyword'] ?? $params->keyboard ?? null)
  34. ])));
  35. }
  36. /**
  37. * 익명 이름 생성
  38. */
  39. protected function createAnonymousName(string $format, int $userID, int $documentID): string
  40. {
  41. return preg_replace_callback('/\$((?:DAILY|DOC|DOCDAILY|)NUM)(?::([0-9]))?/', function($matches) use($userID, $documentID) {
  42. $digits = empty($matches[2]) ? 8 : max(1, min(8, intval($matches[2])));
  43. switch ($matches[1])
  44. {
  45. case 'NUM': return $this->_createHash($userID ?: \IP_ADDRESS, $digits);
  46. case 'DAILYNUM': return $this->_createHash(($userID ?: \IP_ADDRESS) . ':date:' . date('Y-m-d'), $digits);
  47. case 'DOCNUM': return $this->_createHash(($userID ?: \IP_ADDRESS) . ':documentID:' . $documentID, $digits);
  48. case 'DOCDAILYNUM': return $this->_createHash(($userID ?: \IP_ADDRESS) . ':documentID:' . $documentID . ':date:' . date('Y-m-d'), $digits);
  49. }
  50. }, $format);
  51. }
  52. /**
  53. * 익명 이름 Hash 처리
  54. */
  55. protected function _createHash(string $content, int $digits = 8): string
  56. {
  57. return sprintf('%0' . $digits . 'd', hexdec(substr(hash_hmac('sha256', $content, ENCRYPT_KEY), 0, 8)) % pow(10, $digits));
  58. }
  59. }