저번에 이어서 게시물 수정과 삭제를 진행해보겠다
신기했던건 매개변수로 모델객체를 받으면 따로 쿼리문 없이 진행할 수 있다는점에서 새로운 사실에 놀라면서 편하게 구현할 수 있었다 예를 들어
<a href="{{ route('posts.show',['post' => $post]) }}" class="text-2xl font-bold text-gray-700 hover:underline">
이렇게 매개변수를 넘기고 컨트롤러에서
public function edit(Post $post)
{
//post 모델객체 자체를 매개변수로 받기때문에 db에서 값을 가져올 필요가없음
return view('posts.post_edit',['posts' => $post]);
}
이렇게 받으면 쿼리문없이 그냥 바로 전달만 하면 값이 넘어가는사실을 이제야 깨닫고 나도 아직 갈길이 멀다라는 생각이 들었다 이후로는 생각보다 간단했다
@extends('layouts.main')
@section('post_create_content')
<form class="bg-white" method="POST" action="{{ route('posts.update',['post' => $posts]) }}">
@csrf
@method('PATCH')
<div class="min-h-screen md:px-20 pt-6">
<div class=" bg-white rounded-md px-6 py-10 max-w-2xl mx-auto">
<h1 class="text-center text-2xl font-bold text-gray-500 mb-10">글 수정</h1>
<div class="space-y-4">
<div>
<label for="title" class="text-lx font-serif">제목:</label>
<input type="text" placeholder="제목" name="title" id="title" class="@error('title') is-invalid @enderror w-4/5 ml-2 outline-none py-1 px-2 text-md border-2 rounded-md"
value="{{ $posts->title }}" />
@error('title')
<div class=" mr-16 alert alert-danger text-red-600">{{ $message }}</div>
@enderror
</div>
<div>
<label for="editor" class="block mb-2 text-lg font-serif">내용:</label>
<textarea class="@error('editor') is-invalid @enderror form-control" id="editor" name="editor">{{ $posts->content }}</textarea>
@error('editor')
<div class=" mr-16 alert alert-danger text-red-600">{{ $message }}</div>
@enderror
</div>
<button type="submit" class="px-6 py-2 mx-auto block rounded-md text-lg font-semibold text-indigo-100 bg-indigo-600 ">수정 완료</button>
</div>
</div>
</div>
</form>
<script>
CKEDITOR.replace('editor', {
filebrowserUploadUrl: "{{ route('posts.upload', ['_token' => csrf_token()]) }}",
filebrowserUploadMethod: 'form',
});
</script>
@endsection
이렇게 수정하는 화면인 post_edit.blade.php화면을 구성해주고
public function update(Request $request, Post $post)
{
//유효성 검사
$validatedData = $request->validate([
'title' => 'required|max:100',
'editor' => 'required',
]);
//정보 수정
$posts = Post::find($post->id);
$posts->title = $validatedData['title'];
$posts->content = $validatedData['editor'];
$posts->save();
if(!is_null($posts)){
return redirect()->route('main')->with('status', '수정이 완료되었습니다.');
}
else{
return redirect()->back()->with('status', '수정에 실패했습니다.');
}
}
update메서드 구현해주면 끝이다 이미 회원관리해서 했던부분이라 게시물관리라고 크게 다른부분은없었다
삭제기능을 구현하기 전에 먼저 해당 게시물을 작성한 사람만 수정하고 삭제할 수 있도록 조치를 취했다
@if (Auth::check() && $posts->writer == Auth::user()->name)
<form action="{{ route('posts.destroy',['post' => $posts]) }}" method="post" class="w-9/12" id="del">
@csrf
@method('DELETE')
<a href="{{ route('posts.edit',['post' => $posts]) }}"
class="-mt-2 mr-3 text-md font-bold text-white bg-gray-700 rounded-full px-5 py-2 hover:bg-gray-800">수정하기</a>
<a onclick="del();" href='#'
class="-mt-2 mr-3 text-md font-bold text-white bg-gray-700 rounded-full px-5 py-2 hover:bg-gray-800">삭제하기</a>
</form>
@endif
</div>
</section>
<script>
//confirm창으로 게시글 삭제여부 파악
function del(){
var con_test = confirm('정말 삭제하시겠습니까?');
if(con_test == true){
document.getElementById('del').submit();
}
else if(con_test == false){
return;
}
}
</script>
로그인이 되어있고 로그인한 유저의 이름이 해당 게시물의 작성자와 동일할때 수정과 삭제버튼을 활성화했고
삭제를 누르면 confirm창으로 한번더 확인하는 절차를 추가했다 이후로는 삭제기능도 수정과 마찬가지로 이미했던 기능이라 쉽게 진행했다
public function destroy(Post $post)
{
$posts = Post::find($post->id);
$posts->delete();
if(!is_null($posts)){
return redirect()->route('main')->with('status', '게시글이 삭제되었습니다');
}
else{
return redirect()->back()->with('status', '오류로인해 삭제되지않았습니다');
}
}
이렇게 수정과 삭제기능을 마무리하고 검색기능을 구현했는데
https://bumpy1800.tistory.com/59
laravel Scout을 이용한 검색(Algolia 연동)
그냥 쿼리문으로 검색키워드를 비교해서 결과를 띄워주는 방식으로 구현할 수도 있지만 역시 laravel에서 지원하는 Scout을 안써볼수없다고 생각한다 Scout을 Algolia드라이버를 사용하기때문에 Algoli
bumpy1800.tistory.com
구현하는건 따로 다룬바 있고 원래 검색 결과화면을 따로 구성하려했으나 굳이 메인화면과 별차이없는 화면을 또 생성하는건 리소스낭비라고 생각해서 메인화면을 좀 수정해서 완성하였다
{{-- 검색을 했을시와 안했을시로 구분하고 검색했을시 URL에서 변수값을 가져와서 무엇을 검색했는지 알려줌 --}}
@if ($keyword)
<h1 class="text-xl font-bold text-gray-700 md:text-2xl">"<?=$_GET['search']?>"에 대한 검색 결과</h1>
@else
<h1 class="text-xl font-bold text-gray-700 md:text-2xl">전체글</h1>
@endif
{{-- 페이지를 넘길때 URL에 검색 키워드도 같이 넘겨서 상단에 검색키워드를 계속 노출시킨다 --}}
@if ($keyword)
{{ $posts->appends(['search' => $_GET['search']])->links() }}
@else
{{-- 검색을 안했을시 --}}
{{ $posts->links() }}
@endif
이런식으로 검색을 안했을땐 전체글이라고 알려주고 검색한 상황이라면 url에서 search변수값을 가져와서 무엇에 대한 검색결과인지 알려주도록 했다 첨에 페이지네이션으로 인해 자꾸 url에서 search변수가 사라져서
라라벨 8.x - 페이지네이션
라라벨 한글 메뉴얼 8.x - 페이지네이션
laravel.kr
해당 공식문서를 보고 url에서 같이 변수를 넘기도록 해서 해결하여서 메인화면과 검색결과 화면을 한 화면으로 구성하는데 성공하였다 이제 댓글대댓글기능만 구현하면 아마 90%는 완성이라고 생각한다
다음엔 댓글 대댓글구현에 대해 다뤄보겠다
'개발일지 > PHP' 카테고리의 다른 글
| 라라벨 블로그 만들기 #10(완) (댓글&대댓글) (0) | 2022.02.22 |
|---|---|
| 라라벨 블로그 만들기 #8(게시물 list&show) (0) | 2022.02.03 |
| 라라벨 블로그 만들기 #7(게시물 작성) (0) | 2022.01.27 |
| 라라벨 블로그 만들기 #5(내정보, 사진변경, 이메일 인증) (0) | 2022.01.18 |
| 라라벨 블로그 만들기#4(로그인) (0) | 2022.01.12 |