Laravel 9 CRUD 초급 예제
- Laravel 9 CRUD 초급 예제 1부 : Setting & Create- Laravel 9 CRUD 초급 예제 2부 : Read & Update & Delete
- Laravel 9 CRUD 예제 3부 : 페이지네이션(Pagination)
- Laravel 9 CRUD 예제 4부 : 유효성 검사(Validation)
라라벨 공부
Step 1. Read
상세 보기 페이지를 추가해봅시다.
app/Http/Controllers/ProductController.php
class ProductController extends Controller
{
...
// 상세 페이지
public function show(Product $product){
// show 에 경우는 해당 페이지의 모델 값이 파라미터로 넘어옵니다.
return view('products.show', compact('product'));
}
}
라우팅 설정을 추가해줍시다.
routes/web.php
...
// {product}는 주소의 변경가능한 값이 오는 것을 product로 받는 것을 의미합니다, 이 값은 현재 아이디가 오는 데
// 해당 아이디에 맞춘 모델 객체를 ProductController의 show 함수에 매개변수로 보내는 동작을 수행합니다.
Route::get('products/{product}',[ProductController::class, 'show'])->name("products.show");
이제 마지막으로 view를 추가 및 수정해줍니다.
resources/views/products/index.blade.php
...
@foreach ($products as $key => $product)
<tr>
<th scope="row">{{$key+1 + (($products->currentPage()-1) * 10)}}</th>
<td>
<a href="{{route("products.show", $product->id)}}">{{$product->name}}</a>
</td>
<td>{{$product->created_at}}</td>
<td>Edit/Delete</td>
</tr>
@endforeach
...
resources/views/products/show.blade.php
@extends('products.layout')
@section('content')
<h2 class="mt-4 mb-3">Product View: {{$product->name}}</h2>
<p style="text-align: right" class="pt-2">{{$product->created_at}}</p>
<div class="content mt-4 rounded-3 border border-secondary">
<div class="p-3">
{{$product->content}}
</div>
</div>
@endsection
이제 아래와 같이 리스트 페이지에서 상세 페이지로 이동되는 것을 볼 수 있습니다.
Step 2. Update
수정 페이지와 업데이트 기능을 Controller에 추가해줍시다.
app/Http/Controllers/ProductController.php
class ProductController extends Controller
{
...
public function edit(Product $product){
return view('products.edit', compact('product'));
}
public function update(Request $request, Product $product){
$request = $request->validate([
'name' => 'required',
'content' => 'required'
]);
// $product는 수정할 모델 값이므로 바로 업데이트 해줍시다.
$product->update($request);
return redirect()->route('products.index', $product);
}
}
라우팅 설정을 추가해줍시다.
routes/web.php
// 수정 페이지
Route::get('products/{product}/edit', [ProductController::class, 'edit'])->name("products.edit");
// Laravel에서 업데이트의 대한 메서드로는 Patch 또는 Put을 권장합니다.
Route::patch('products/{product}', [ProductController::class, 'update'])->name('products.update');
아래는 공식 문서에서 권장하는 라우트 설정과 Controller Action명입니다, 참고하시면 되겠습니다.
이제 리스트 페이지와 수정 페이지를 수정해봅시다.
resources/views/products/index.blade.php
...
@foreach ($products as $key => $product)
<tr>
<th scope="row">{{$key+1 + (($products->currentPage()-1) * 10)}}</th>
<td>
<a href="{{route("products.show", $product->id)}}">{{$product->name}}</a>
</td>
<td>{{$product->created_at}}</td>
<td>
<a href="{{route("products.edit", $product)}}">Edit</a>
/ Delete
</td>
</tr>
@endforeach
...
resources/views/products/edit.blade.php
@extends('products.layout')
@section('content')
<h2 class="mt-4 mb-3">Product Edit</h2>
{{-- 유효성 검사에 걸렸을 경우 --}}
@if ($errors->any())
<div class="alert alert-warning" role="alert">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{route('products.update',$product)}}" method="post">
{{-- 라라벨은 CSRF로 부터 보호하기 위해 데이터를 등록할 때의 위조를 체크 하기 위해 아래 코드가 필수 --}}
@csrf
{{-- 라라벨 patch 메서드 사용 --}}
@method('patch')
<div class="mb-3">
<label for="name" class="form-label">Name</label>
<input type="text" name="name" class="form-control" id="name" autocomplete="off" value="{{$product->name}}">
</div>
<div class="mb-3">
<label for="content" class="form-label">Content</label>
<textarea rows="10" cols="40" name="content" class="form-control" id="name" autocomplete="off">{{$product->content}}</textarea>
</div>
<button type="submit" class="btn btn-primary">Update</button>
<a href="{{route("products.index")}}">
<button type="button" class="btn btn-primary">Cancel</button>
</a>
</form>
@endsection
이제 아래와 같이 업데이트가 작동할 것입니다.
Step 3. Delete
이제 마지막으로 삭제 기능을 추가하겠습니다.
app/Http/Controllers/ProductController.php
class ProductController extends Controller
{
...
public function destroy(Product $product){
$product->delete();
return redirect()->route('products.index');
}
}
라우팅 설정을 추가해줍시다.
routes/web.php
Route::delete('products/{product}', [ProductController::class, 'destroy'])->name('products.destroy');
이제 view를 수정해줍시다.
resources/views/products/index.blade.php
...
@foreach ($products as $key => $product)
<tr>
<th scope="row">{{$key+1 + (($products->currentPage()-1) * 10)}}</th>
<td>
<a href="{{route("products.show", $product->id)}}">{{$product->name}}</a>
</td>
<td>{{$product->created_at}}</td>
<td>
<input type="button" value="Edit" onclick="location.href='{{route("products.edit", $product)}}'"/>
<form action="{{route('products.destroy', $product->id)}}" method="post" style="display:inline-block;">
{{-- delete method와 csrf 처리필요 --}}
@method('delete')
@csrf
<input onclick="return confirm('정말로 삭제하겠습니까?')" type="submit" value="delete"/>
</form>
</td>
</tr>
@endforeach
...
아래와 같이 삭제가 가능할 것입니다.
이걸로 Laravel 9로 CRUD를 만들어보았습니다.
Laravel 9가 LTS로 지정된 만큼 앞으로도 라라벨9를 이용해서 프로젝트를 진해야겠네요.
'PHP > Laravel' 카테고리의 다른 글
Laravel 9 CRUD 예제 4부 : 유효성 검사(Validation) (0) | 2022.08.11 |
---|---|
Laravel 9 CRUD 예제 3부 : 페이지네이션(Pagination) (0) | 2022.08.10 |
Laravel 9 CRUD 초급 예제 1부 : Setting & Create (19) | 2022.08.09 |
Laravel 테이블에 복합키로 Unique 속성 주기 (0) | 2022.07.22 |
phpstorm 이미지 주소 정규식 검색 후 변경 (0) | 2022.07.20 |