구현한 게시판 사진
게시글 목록
게시글 작성
게시글 자세히 보기
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 기능 그리고 게시글 추천기능을 만들 계획!!
'IT 공부 > Laravel' 카테고리의 다른 글
[ Laravel ] Vue.js로 실시간 채팅(메세지 저장/불러오기) (0) | 2021.04.01 |
---|---|
[ Laravel ] Vue.js를 이용한 실시간 채팅 (유저목록) (0) | 2021.03.31 |
[ Laravel ] Vue.js를 이용한 실시간 채팅 (필요한 개념) (0) | 2021.03.31 |
[ Laravel ] 친구추가 기능 (0) | 2021.03.28 |
[ Laravel ] email 인증을 통한 회원가입. (0) | 2021.03.24 |