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개의 댓글

관련 채용 정보