Trait를 이용한 게시판 만들기 - 1

김문범·2021년 8월 5일
0

라라벨 CMS 부품들

목록 보기
2/4
post-thumbnail

여러가지로 활용 가능한 게시판 코드를 작성해보았습니다.
기본적인 기능만 구현을 하였습니다.
응용이 필요한 게시판 코드입니다.

1. 커스텀 헬퍼에 게시판 route 생성 함수

if (!function_exists('admin_board_route')) {
    /**
     * 관리자 게시판 라우트 생성
     * @param string $prefix
     * @param string $controller
     * @param string $boards
     */
    function admin_board_route(string $prefix, string $controller, string $boards)
    {
        $name = str_replace('/', '.', $prefix);

        // Index
        Route::get("{$prefix}/{boardId}", [$controller, 'index'])
            ->where(["boardId" => "({$boards})"])
            ->name("{$name}.index"); 
    }
}

위와 같은 방식으로 커스텀 헬퍼에 함수를 생성합니다.
where메소드를 통해 "파라미터"를 제한합니다.(정규표현식으로도 제약 가능)

2. route.php에 함수 입력방법

Route::group([
    'as' => 'admin.',
    'middleware' => ['level:admin'],
], function () {
    Route::get('/index', [IndexController::class, 'index'])->name('home');

    Route::group([
        'prefix' => 'board', 'as' => 'board.'
    ], function () {
        // 게시판 목록 관리
        Route::resource('boardInfos', BoardInfoController::class)->where(['boardInfo' => '[0-9]+']);
        // 게시판 관리
        admin_board_route('boardManagement', BoardController::class, 'test1');
    });
});

위의 "middleware"에 "level:admin"의 변수를 첨가하여 "관리자 페이지"에는 회원등급이 관리자가 아니면 접근 못하도록 제한합니다.
그리고, 함수 "admin_board_route"를 작성합니다. 이 함수 하나면 게시판 관련 모든 route가 자동으로 생성됨.

BoardController::class라고 작성하면, "BoardController"의 모든 클래스가 포함된다는 의미이다.
다른 방법도 있겠지만, "test1"이라는 게시판을 생성하고 게시판 코드를 저렇게 입력하면, 입력된 게시판 코드를 제외한 나머지는 404처리가 된다.
"test1|test2"의 방식으로 복수의 게시판 코드를 입력하여 관리가 가능하다.

3. TraitBoard 생성

trait TraitBoard
{
    protected $cookie;
    protected $board;
    protected $boardData = [];
    protected $skin;

    /**
     * 게시판 정보 가져오기
     * @param string $boardId
     * @return mixed
     */
    protected function getBoardInfo(string $boardId)
    {
        $this->board = BoardInfo::where('code', $boardId)->firstOrFail();
        $this->skin = $this->board->skin ?? 'basic';

        return $this->board;
    }

    /**
     * 게시판 목록 가져오기
     * @param string $boardId
     * @param int $perPage
     */
    protected function getBoardList(string $boardId, int $perPage = 15)
    {
        $boardInfo = $this->getBoardInfo($boardId);
        $this->boardData['boardInfo'] = $boardInfo;

        $this->boardData['lists'] = $boardInfo->posts()
            ->with('user', 'files')->withCount('comments')
            // ->when() 검색 부분 추가 할 곳
            ->orderByDesc('notice')->latest()->paginate($perPage);
    }
}

"protected function" 방식으로 생성함.
검색기능을 추가하면 "getBoardList"에 when메소드에 추가 필요.

4. controller에서 trait 사용하여 class 만들기

class BoardController extends Controller
{
    use TraitBoard;

    /**
     * @param string $boardId
     * @return \Illuminate\Contracts\View\View
     */
    public function index(string $boardId)
    {
        $perPage = 15;
        $this->getBoardList($boardId, $perPage);
        
	// return view()->first(["admin.board.skin.{$this->skin}.index", 'admin.board.skin.basic.index'], $this->boardData);
        return View::first(["admin.board.skin.{$this->skin}.index", 'admin.board.skin.basic.index'], $this->boardData);
    }
}

"use TaritBoard"를 통해 trait를 사용 가능함.

"$this->(trati에 있는 함수명)" 이러한 방식으로 controller에서 함수를 만들어서 사용함.
"return"은 파사드로 처리했으나, 메소드 방식으로도 처리 가능함.

이상입니다.
다음으로는 완성된 소스를 작성하겠습니다.

profile
다양하지만 공부할 것이 많은 개발자입니다.

0개의 댓글