일반적인 커뮤니티의 게시판들은 회원가입을 하고 로그인을 해야 글쓰기가 가능한 경우가 대부분이다. 그래서 로그인을 먼저 했던거였다. 그럼 글쓰기 페이지를 만들어 보자.
글쓰기 페이지를 만들려면 우선 등록 버튼에 링크를 걸어야하고 링크를 라우터에 등록을 해야 하고 또 컨트롤러를 작성해야 하고 컨트롤러에서 어느 페이지로 가라고 알려줄테니 그 페이지를 만들면 된다. 해보자.
링크부터 걸어보자.
/resources/views/boards/index.blade.php
@extends('boards.layout')
@section('header')
<div class="d-flex flex-column flex-md-row align-items-center pb-3 mb-4 border-bottom">
<span class="fs-4">게시판 목록</span>
<nav class="d-inline-flex mt-2 mt-md-0 ms-md-auto">
@guest()
<a href="{{route('auth.login')}}" class="text-xl">로그인</a> /
<a href="{{route('auth.signup')}}" class="text-xl">회원가입</a>
@endguest
@auth()
<form action="/logout" method="post" class="inline-block">
@csrf
<span class="text-xl text-blue-500">{{auth()->user()->userid}}</span> /
<a href="/logout"><button class="text-xl">로그아웃</button></a>
</form>
@endauth
</nav>
</div>
@endsection
@section('content')
<div style="text-align:right;">
<a href="/boards/write"><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>
이런식으로 등록버튼에 링크를 걸어주었다. 아래 소스는 너무 길어지니 잘랐다.
다음은 라우터에 등록한다.
/routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BoardController;
use App\Http\Controllers\MemberController;
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');
Route::get('/boards/write', [BoardController::class, 'write'])->name('boards.write');
//회원
Route::get('/login', [MemberController::class, 'login'])->name('auth.login');
Route::get('/signup', [MemberController::class, 'signup'])->name('auth.signup');
Route::post('/signupok', [MemberController::class, 'signupok'])->name('auth.signupok');
Route::post('/emailcheck', [MemberController::class, 'emailcheck'])->name('auth.emailcheck');
Route::post('/loginok', [MemberController::class, 'loginok']) -> name('auth.loginok');
Route::post('/logout', [MemberController::class, 'logout']) -> name('auth.logout');
BoardController의 write를 찾아가라고 했으니 만들어보자.
/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]);
}
public function write()
{
return view('boards.write');
}
}
그 다음엔 뭐? boards밑에 write.blade.php를 만든다.
/resources/views/boards/write.blade.php
@extends('boards.layout')
@section('content')
<br />
<form method="post" action="/boards/create" enctype="multipart/form-data">
@csrf
@method('post')
<div class="form-group">
<div class="col-md-8">
<input type="text" name="subject" id="subject" class="form-control input-lg" placeholder="제목을 입력하세요." />
</div>
<br />
</div>
<div class="form-group">
<div class="col-md-8">
<textarea class="form-control" id="contents" name="contents" rows="5" placeholder="내용을 입력하세요."></textarea>
</div>
</div>
<br />
<br />
<div class="col-md-8 form-group text-center">
<button type="button" name="edit" class="btn btn-primary input-lg" onclick="sendsubmit()">등록</button>
</div>
</form>
@endsection
이렇게 하고 목록에 있는 등록 버튼을 클릭하면
이렇게 나오면 된다. 아주 쉽다.
하지만 이렇게 끝나면 너무 쉬우니까 조금 더 작업을 해주어야 한다. 글쓰기 페이지는 로그인을 한 회원만 입장이 가능하도록 해야 하니 그 부분을 추가한다.
/app/Http/Controllers/BoardController.php
public function write()
{
if(auth()->check()){
return view('boards.write');
}else{
return redirect()->back()->withErrors('로그인 하십시오.');
}
}
write를 이렇게 수정한다. 로그인이 된 상태 즉 auth()에 값이 있으면 통과하고 아니면 다시 돌아가도록 해 주었다. 다시 돌아가면서 에러에도 값을 추가했다. 이 에러를 돌아간 페이지에서 보여주면 된다.
/resources/views/boards/index.blade.php
@section('content')
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div style="text-align:right;">
<a href="/boards/write"><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>
등록 버튼 위에 errors에 값이 있으면 출력하도록 해 주었다. 이제 로그아웃 된 상태에서 등록 버튼을 클릭하면
이렇게 나오게 된다. 물론 로그인 하면 이렇게 나오면 안되고 로그인을 안한 상태에서만 이렇게 나와야 한다.
자 그런데 이렇게 로그인 validate를 매번 콘트롤러에서 하지 않고 해당 되는 모든 페이지들에 대해 할 수 가 있다. 라우터에 등록하면 된다.
/routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BoardController;
use App\Http\Controllers\MemberController;
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');
Route::middleware('auth') -> group(function (){
Route::get('/boards/write', [BoardController::class, 'write'])->name('boards.write');
});
//회원
Route::get('/login', [MemberController::class, 'login'])->name('auth.login');
Route::get('/signup', [MemberController::class, 'signup'])->name('auth.signup');
Route::post('/signupok', [MemberController::class, 'signupok'])->name('auth.signupok');
Route::post('/emailcheck', [MemberController::class, 'emailcheck'])->name('auth.emailcheck');
Route::post('/loginok', [MemberController::class, 'loginok']) -> name('auth.loginok');
Route::post('/logout', [MemberController::class, 'logout']) -> name('auth.logout');
이렇게 해주면 auth 사이에 들어가는 페이지들은 로그인을 하지 않으면 접근할 수가 없다. 그리고 로그인없이 접근하면 자동으로 로그인 페이지로 넘어가게 해주어야 한다.
/app/Http/Middleware/Authenticate.php
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Http\Request;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*/
protected function redirectTo(Request $request): ?string
{
return $request->expectsJson() ? null : route('auth.login');
}
}
이렇게 route 뒤에 주소를 라우터에 등록한 닉네입으로 등록해주면 된다. 이게 잘못되면 에러나니까 꼭 수정해야 한다.
이제 로그인 안하고 등록 버튼을 누르면 자동으로 로그인 페이지로 넘어간다.
너무 길어져서 디비에 등록하는건 다음 시간에 해보도록 하겠다.