게시판 목록에서 제목을 클릭하면 게시판 내용을 보는 보기 페이지로 넘어 간다. 보기 페이지를 만들어보자.
우선 목록에서 제목에 링크를 달아준다.
/resources/views/boards/index.blade.php
@extends('boards.layout')
@section('content')
<h2 class="mt-4 mb-3">게시판 목록</h2>
<div style="text-align:right;">
<button class="text-xl">등록</button></a>
</div>
<table class="table table-striped table-hover">
<colgroup>
<col width="10%"/>
<col width="15%"/>
<col width="45%"/>
<col width="15%"/>
<col width="15%"/>
</colgroup>
<thead>
<tr>
<th scope="col">번호</th>
<th scope="col">이름</th>
<th scope="col">제목</th>
<th scope="col">조회수</th>
<th scope="col">등록일</th>
</tr>
</thead>
<tbody>
<?php
$pagenumber = $_GET["page"]??1;
$idx = $boards->total()-(($boards->currentPage()-1) * 20);
?>
@foreach ($boards as $board)
<tr>
<th scope="row">{{ $idx-- }}</th>
<td>{{ $board->userid }}</td>
<td><a href="/boards/show/{{$board->bid}}/{{$pagenumber}}">{{ $board->subject }}</a></td>
<td>{{ number_format($board->cnt) }}</td>
<td>{{ date("Y-m-d",strtotime($board->regdate)) }}</td>
</tr>
@endforeach
</tbody>
</table>
<div>
{!! $boards->withQueryString()->links() !!}
</dvi>
@endsection
board 테이블에 조회수 컬럼이 없어서 board 테이블에 cnt라는 컬럼을 추가 해주었다. 라라벨은 컬럼을 추가하는 것도 명령어가 있지만 그냥 추가했다. 귀찮아서. 하지만 Board 모델에서 fillable에 추가한 컬럼명을 추가해 주어야 한다. 반드시.
/app/Models/Board.php
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'bid';
/**
* Attributes that should be mass-assignable.
*
* @var array
*/
protected $fillable = [
'content', 'multi', 'subject', 'userid', 'cnt'
];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = [
];
모델 파일의 $fillable 부분에 cnt를 추가해 준다. 추가하지 않으면 cnt에 값을 입력할 수 없다.
<td><a href="/boards/show/{{$board->bid}}/{{$pagenumber}}">{{ $board->subject }}</a></td>
링크를 보면 /boards/show/라는 라우터를 만들어야 하고 라우터에서 받을때 게시판의 아이디와 페이지 넘버를 받아 주어야 한다. 라우터에 추가해보자.
/routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BoardController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
//게시판
Route::get('/boards', [BoardController::class, 'index'])->name('boards.index');
Route::get('/boards/show/{id}/{page}', [BoardController::class, 'show'])->name('boards.show');
get방식으로 하나씩 받아 주면 된다.그리고 이걸 받아서 BoardController의 show 함수로 넘겨준다. 콘트롤러를 수정해 보자.
/app/Http/Controllers/BoardController.php
<?php
namespace App\Http\Controllers;
use App\Models\Board;
use Illuminate\Http\Request;
class BoardController extends Controller
{
public function index(){
$boards = Board::orderBy('bid','desc')->paginate(20);
return view('boards.index', compact('boards'));
}
public function show($bid,$page)
{
Board::find($bid)->increment('cnt');
$boards = Board::findOrFail($bid);
$boards->content = htmlspecialchars_decode($boards->content);
$boards->pagenumber = $page;
return view('boards.view', ['boards' => $boards]);
}
}
파라미터를 $bid와 $page로 받았다.
첫째줄에서 cnt를 증가시켜주었고 $boards에 게시판 정보를 가져온 뒤 content 의 내용을 htmlspecialchars_decode 해준다. 라라벨은 무조건 htmlspecialchars 이렇게 받아오기때문에 반드시 변경해 주어야 한다.
그리고 테이블에서 값을 가져올땐 없었지만 view페이지에 넘겨주어야 하는 값인 $page를 $boards->pagenumber로 추가해 주었다. 이렇게 하면 view 페이지에서 값을 사용할 수 있다.
다음엔 boards 폴더에 view.blade.php로 값을 넘겨준다고 했으니 해당 파일을 만들어 보자.
/resources/views/boards/view.blade.php
@extends('boards.layout')
@section('content')
<h2 class="mt-4 mb-3">게시판 보기</h2>
<table class="table table-striped table-hover">
<tbody>
<tr>
<th width="100">제목</th>
<td>{{ $boards->subject }}</td>
</tr>
<tr>
<td colspan="2">글쓴이 : {{ $boards->userid }} / 조회수 : {{ number_format($boards->cnt) }} / 등록일 : {{ $boards->regdate }}</td>
</tr>
<tr>
<th width="100">내용</th>
<td>{!! $boards->content !!}</td>
</tr>
</tbody>
</table>
<div align="right">
<a href="/boards/?page={{ $boards->pagenumber }}" class="btn btn-primary">목록</a>
</div>
@endsection
$boards로 넘겨주었으니 해당 변수로 받아서 뿌려준다. 이제 화면으로 확인해보자.
목록에서 링크를 눌렀을때 이렇게 나오면된다.
비회원으로 접근할 수 있는 페이지는 이정도니까 다음 시간엔 회원등록을 해보자