본문 바로가기
IT/PHP

Laravel 8 - CURD(8)

by Sungjun_ 2021. 1. 8.

인증된 사용자

 

인증된 사용자만 게시판에 들어가고 글 작성 및 수정을 하게 바꿔보겠습니다.

 

현재 로그인을 하지 않아도 게시판에 들어 갈 수 있는데, 로그인을 해야 들어가게 바꾸겠습니다.

 

먼저 web.php 라우트를 수정하겠습니다.

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BoardController;
use App\Http\Controllers\RegisterController;
use App\Http\Controllers\LoginController;

Route::get('/', function () {
    return view('home');
}) -> name('home');

Route::get('auth/register', [RegisterController::class, 'index']) -> name('auth.register.index');
Route::post('auth/register', [RegisterController::class, 'store']) -> name('auth.register.store');

Route::get('auth/login', [LoginController::class, 'index']) -> name('auth.login.index');
Route::post('auth/login', [LoginController::class, 'login']) -> name('auth.login.attempt');
Route::post('auth/logout', [LoginController::class, 'logout']) -> name('auth.logout');

Route::get('boards', [BoardController::class, 'index']) -> name('boards.index');
Route::get('boards/create', [BoardController::class, 'create']) -> name('boards.create');
Route::post('boards', [BoardController::class, 'store']) -> name('boards.store');
Route::get('boards/{board}', [BoardController::class, 'show']) -> name('boards.show');
Route::get('boards/{board}/edit', [BoardController::class, 'edit']) -> name('boards.edit');
Route::put('boards/{board}', [BoardController::class, 'update']) -> name('boards.update');
Route::delete('boards/{board}', [BoardController::class, 'destroy']) -> name('boards.delete');

 

위와 같이 라우트가 설정되어있는데, 게시판 관련인 boards의 라우트를 수정하겠습니다.

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BoardController;
use App\Http\Controllers\RegisterController;
use App\Http\Controllers\LoginController;

Route::get('/', function () {
    return view('home');
}) -> name('home');

Route::get('auth/register', [RegisterController::class, 'index']) -> name('auth.register.index');
Route::post('auth/register', [RegisterController::class, 'store']) -> name('auth.register.store');

Route::get('auth/login', [LoginController::class, 'index']) -> name('auth.login.index');
Route::post('auth/login', [LoginController::class, 'login']) -> name('auth.login.attempt');
Route::post('auth/logout', [LoginController::class, 'logout']) -> name('auth.logout');


Route::middleware('auth') -> prefix('boards') -> group(function (){
    Route::get('/', [BoardController::class, 'index']) -> name('boards.index');
    Route::get('create', [BoardController::class, 'create']) -> name('boards.create');
    Route::post('/', [BoardController::class, 'store']) -> name('boards.store');
    Route::get('{board}', [BoardController::class, 'show']) -> name('boards.show');
    Route::get('{board}/edit', [BoardController::class, 'edit']) -> name('boards.edit');
    Route::put('{board}', [BoardController::class, 'update']) -> name('boards.update');
    Route::delete('{board}', [BoardController::class, 'destroy']) -> name('boards.delete');
});

 

middleware('auth')를 사용하면 인증된 사용자만 접근할 수 있습니다.

prefix를 사용해서 공통적으로 겹치는 boards를 빼주었고, group을 사용해 묶었습니다.

 

이게 게시판 버튼을 누르면

에러

 

이렇게 에러가 나올겁니다.

그 이유는 app/Http/Middleware/Authenticata.php 파일을 보면 알 수 있습니다.

 

Authenticata.php

 

코드를 보면 redirectTo 메소드에 route 이름이 login인 곳으로 가게 해두었습니다.

 

그래서 방법은 redirectTo 메소드에서 route 이름을 현재 사용중인 auth.login.index로 하거나

web.php에서 auth.login.index를 login으로 바꾸면 됩니다.

저는 라라벨 기본으로 되어있는 login으로 바꾸겠습니다.

login으로 바꾸면 resources/views/layouts/app.blade.php에 가서 로그인인 부분의 route 이름도 같이 바꿔주어야합니다.

 

이제 다시 게시판 버튼을 누르면 로그인 화면으로 가는 것을 볼 수 있습니다.

그리고 로그인 후, 게시판 버튼을 누르면 게시판 화면이 보입니다.

 

다음으로, 글을 작성할 때 글 작성자의 정보도 같이 저장되게 하겠습니다.

database/migrations/create_boards_table.php 파일로 들어가서 수정하겠습니다.

public function up()
    {
        Schema::create('boards', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->string('user_name');
            $table->string('title');
            $table->longText('story');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users');
        });
    }

 

up 메소드 부분을 위와 같이 수정해줍니다.

user_id 콜롬은 users 테이블의 id를 참조합니다.

그리고 터미널에 php artisan migrate:refresh를 해서, 원래 있던 테이블들을 드롭하고 다시 마이그레이트 해줍니다.

원래 있던 사용자 정보가 사라졌기 때문에 다시 회원가입 해야합니다.

 

app/Http/Controllers/BoardController.php에 들어가서 store 메소드를 수정합니다.

public function store(Request $request){
        $validation = $request -> validate([
            'title' => 'required',
            'story' => 'required'
        ]);

        $board = new Board();
        $board -> user_id = auth() -> user() -> id;
        $board -> user_name = auth() -> user() -> name;
        $board -> title = $validation['title'];
        $board -> story = $validation['story'];
        $board -> save();

        return redirect('boards/'.$board -> id);
    }

user_id, user_name에 각각 사용자의 id와 name을 넣어줍니다.

그리고 app/Models/Board.php로 들어가 fillable에 user_id, user_name을 추가해줍니다.

redirect 부분도 작성한 글로 가게 만들었습니다.

class Board extends Model
{
    use HasFactory;
    protected $fillable = ['title', 'story', 'user_id', 'user_name'];
}

 

글을 작성하고 확인해보면

store

제대로 저장된 것을 확인할 수 있습니다.

마지막으로 글 목록에 작성자 이름도 나오게 수정해주고 마치겠습니다.

@extends('layouts.app')

@section('section')
    <section class="w-2/3 mx-auto mt-8 ">
        <div class="flex w-full justify-between">
            <div class="flex-initial text-2xl text-green-500">게시판</div>
            <div class="flex-initial">
                <a href="{{route('boards.create')}}">
                    <button class="px-4 py-2 text-white bg-blue-500 hover:bg-blue-700">글쓰기</button>
                </a>
            </div>
        </div>
        <div class="w-full mt-8">
            <table class="w-3/4 mx-auto text-lg">
            @foreach($boards as $board)
                    <thead>
                        <tr>
                            <td class="w-1/5"></td>
                            <td class="w-1/5"></td>
                            <td class="w-2/5"></td>
                            <td class="w-1/5"></td>
                        </tr>
                    </thead>
                    <tbody>
                        <tr class="border-b mt-2">
                            <td class="w-1/5 text-center">{{$board -> id}}</td>
                            <td class="w-1/5">{{$board -> user_name}}</td>
                            <td class="w-2/5"><a href="{{route('boards.show', $board -> id)}}">{{$board -> title}}</a></td>
                            <td class="w-1/5 text-center">{{$board -> created_at -> format('Y-m-d')}}</td>
                        </tr>
                    </tbody>
            @endforeach
            </table>
        </div>
    </section>
@stop

 

글 목록

 

'IT > PHP' 카테고리의 다른 글

Laravel - TDD(1)  (0) 2021.01.13
Laravel 8 - CRUD(9)  (0) 2021.01.08
Laravel 8 - CRUD(7)  (0) 2021.01.07
Laravel 8 - CRUD(6)  (1) 2021.01.07
Laravel 8 - CRUD(5)  (1) 2021.01.05

댓글