IT 공부/Laravel

[ Laravel ] 게시판 만들기

JONGI-N CHOI 2021. 3. 26. 23:33

구현한 게시판 사진

 

게시글 목록

 

게시글 작성

 

게시글 자세히 보기

 

 

URL 파싱 (web.php)

Route::get('/forum', ForumController::class, 'index');

Route::get('/forum/create', ForumController::class, 'create');

Route::POST('/forum/{{ forum }}', ForumController::class, 'store');

URL주소에 따라서 어떤 작업을 할지를 파싱으로 나누어서 할당하는 역할을 한다.

 

위에 같은 경우에는 각 작업마다 한줄한줄 코드를 작성했지만,

 

Route::resource('forum', ForumController::class);

Laravel에서는 많이쓰는 CRUD작업에 대한 코드를 간편하게 작성할 수 있도록 제공해주고 있다. 

 

 

컨트롤러 App/Http/Controller/ForumController.php

public function __construct()
{
   $this->middleware('auth')->except('index');
}

위의 코드는 제약을 준것이다.

 

현제 ForumController는 로그인이 되어있을 경우에만 접근 가능하도록 제약했다.

단, index 메소드는 제외하고 (except('index')) 라는 의미다. 

 

게시글의 목록은 비로그인(게스트)도 볼 수 있지만, 글을 작성하거나 읽거나 하는 기능은 로그인한 사람만 가능하도록 하기 위해서이다. 

 

public function index()
{   
  $forums = Forum::OrderBy('created_at', 'desc') -> paginate(5);        

  return view('forum.index', [
  'forums' => $forums            
  ]);
}

index() 함수는 게시글 목록을 보여주기 위해 존재

Forum모델을 이용해서 DB에 데이터를 받아올려고 하고있는데 OrderBy Query문을 이용해서 최신순으로 정렬해서 가져오게 된다. 

paginate(5);는  말그대로 페이징을 하기 위함 한 페이지당 5개의 글 목록을 보여준다. 

 

return을 통해서 view로 쏴주게되는데 fourm 디렉토리에 있는 index에 보내는 것이다.

그냥 index 화면을 띄어주는 것만 하는 것이아니라 데이터를 같이 보내고 있다. 

Forum모델에 접근해서 가져온 데이터들을 $forums 변수에 넣어서 같이 데이터를 보내줬다. -> index 블레이드에서 사용하기 위함

 

public function create()
{
  return view('forum.create');
}

create함수는 게시글을 작성하기 위해서 view로  create 블레이드로 쏴줌

 

public function store()
  {   
    request() -> validate([
    'title' => 'required',
    'body'  => 'required'                     
  ]);

  $values = request(['title', 'body']);
  $values['user_id'] = auth() -> id();
  $forum = Forum::create($values);
  return redirect('/forum');
}

store함수는 글 작성한 것을 DB에 저장하는 함수를 담당

 

request() -> validate는 view 파일에서 받아온 데이터들을 검증하는 것이다. 

title => required  -> title 항목이 null인지 아닌지 유저가 잘 작성을 했는지 검증하는 작업

 

Forum::create(); 검증이 끝난 값을 DB에 저장한다. 

그리고, redirect를 이용해서 작업이 다끝나면 도메인/forum  URL로 이동시킨다. 

 

VIEW (resources/view/forum/index.blade.php)

<div class="h-screen px-64 mt-5">
    <div class="float-right">
        <a href="/forum/create">
            <button class= "bg-gray-700 hover:bg-gray-900 text-white font-bold py-2 px-4 border border-gray-900">Forum登録</button>
        </a>
    </div>
    <div class="border-b-4 border-gray-800 mt-12 mb-5">
        <h1 class="text-3xl font-bold">Forum</h1>
    </div>
    <ul class="p-3">
        @foreach($forums as $forum)
            <a href="/forum/{{ $forum->id }}">
                <li class="border-4 border-gray-500 px-2 py-2 mt-4">タイトル : {{ $forum-> title }} <small class="float-right">created_at {{ $forum -> created_at}}</small><br>
                内容 : {{ $forum -> body }} </li>
            </a>             
        @endforeach
    </ul>    
    {!! $forums->render() !!}
</div>

forumController에서 index 함수가 Forums 테이블에 있는 데이터를 보내줬기 때문에, index.blade.php 에서도 사용이 가능하다. 

그 데이터들을 foreach문을 이용해서 하나씩 끄집어 낸다. 

간단하게 게시글이 제목( {{ $forum -> title }} )과 내용( {{ $forum -> body }} ) 그리고 작성일( {{$forum -> created_at }})만 보여지도록 했다. 

 

그리고 a태그를 통해서 해당 글 목록이 눌러졌을 경우에는 /forum/{{ $forum->id }} 의 주소로 날려보내는 것을 볼 수 있다. 

 

해당 게시물을 자세히 보기위해서 해당 게시글의 id 값을 보내서 controller에서 그 값을 이용해서 DB에서 데이터값을 받아오기 위함이다. 

 

VIEW (resources/view/forum/show.blade.php)

</div>

    タイトル : {{ $forum -> title }} <small class="float-right">created_at {{ $forum -> created_at }}</small><br>
    <small class="float-right">updated_at {{ $forum -> updated_at }}</small><br>
    <small class="float-right">著者 {{ $forum->user->name }}</small><br>    
    内容
    <div class="border p-3 my-3">{{ $forum -> body }}</div>
    
    <div>
 </div>

show.blade.php에서는 게시글 목록에서 게시글을 눌렀을 경우에 자세하게 글을 볼 수 있는 페이지이다. 

 

현재는 간단하게 제목과 글과 작성자 등등의 내용 밖에 없지만, edit, delete, 추천 기능이 추가될 예정이다. 

 

$forum->user->name이 의미하는 것은 현재 게시글을 쓴 사람의 이름을 의미하는데, 이렇게 사용하기 위해서는 Model의 관계를 정의해줘야할 필요가 있다. 

 

Model (App/Models/User)

public function Forums()
{
  return $this->hasMany(Forum::class);
}

User의 입장에서는 많은 게시글을 작성할 수 있기 때문에, 한명의 User에 여러게의 Forums가 존재한다.

1 대 다수의 관계 -> hasMany

Model (App/Models/Forum)

public function user() 
{
  return $this->belongsTo(User::class);
}

Forum의 입장에서는 하나 하나의 Forum은 한명의 User에 속해있는 관계 -> belongsTo 

 

(아직 DB에 지식이 부족해서 .... 다른 분야도 마찬가지지만 틀릴 수 도 있다....) 

 

위와 같이 모델의 관계를 정의해줬기 때문에 

 

$user -> forum -> id() 처럼 user에서 부터 forum으로 접근이 가능하고 그 반대의 경우도 가능하게 된다. 

 

 

 

이제 다음은, edit와 delete 기능 그리고 게시글 추천기능을 만들 계획!!