PHP/Laravel

Laravel 9 CRUD 초급 예제 2부 : Read & Update & Delete

DSeung 2022. 8. 10. 10:03

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를 이용해서 프로젝트를 진해야겠네요.

 

 

반응형