여러가지로 활용 가능한 게시판 코드를 작성해보았습니다.
기본적인 기능만 구현을 하였습니다.
응용이 필요한 게시판 코드입니다.
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메소드를 통해 "파라미터"를 제한합니다.(정규표현식으로도 제약 가능)
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"의 방식으로 복수의 게시판 코드를 입력하여 관리가 가능하다.
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메소드에 추가 필요.
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"은 파사드로 처리했으나, 메소드 방식으로도 처리 가능함.
이상입니다.
다음으로는 완성된 소스를 작성하겠습니다.