IT/PHP

Laravel 8 - CRUD(2)

Sungjun_ 2021. 1. 4. 16:31

CRUD 중에서 Create를 만들어보겠습니다.

 

resources/views/boards/index.blade.php 파일에 글쓰기 버튼을 만들어줍시다.

@extends('layouts.app')

@section('section')
    <section class="w-2/3 mx-auto mt-8 ">
        <div class="flex w-full justify-between">
            <div class="flex-initial text-2xl text-green-500">게시판</div>
            <div class="flex-initial">
                <a href="{{route('boards.create')}}">
                    <button class="px-4 py-2 text-white bg-blue-500 hover:bg-blue-700">글쓰기</button>
                </a>
            </div>
        </div>
    </section>
@stop

 

 

그리고 web.php에 route를 추가해줍니다.

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('home');
}) -> name('home');


Route::get('boards', function (){
    return view('boards.index');
}) -> name('boards.index');

Route::get('boards/create', function (){
    return view('boards.create');
}) -> name('boards.create');

 

boards 아래에 create.blade.php를 만들어줍니다.

@extends('layouts.app')

@section('section')
    <section class="w-2/3 mx-auto">
        <div class="w-full text-2xl text-green-500 mt-8">글쓰기</div>
        <form action="/boards" method="post" class="mt-8 w-full">
            @csrf
            <p>
                <label for="title" class="text-xl">제목 : </label>
                <input type="text" id="title" name="title"
                       class="outline-none border border-blue-400 w-1/2 pl-1 py-1 rounded-lg">
            </p>
            <p class="mt-4">
                <label for="story" class="text-xl">내용</label>
                <textarea id="story" name="story"
                          class="outline-none border border-blue-400 w-full h-64 mt-2 rounded-lg resize-none"></textarea>
            </p>

            <p class="mt-8">
                <input type="submit" value="작성" 
                       class="px-4 py-1 bg-green-500 hover:bg-green-700 text-lg text-white">
                <input type="button" value="취소" onclick="history.back()"
                       class="px-4 py-1 ml-6 bg-red-500 hover:bg-red-700 text-lg text-white">
            </p>
        </form>
    </section>
@stop

 

database/migration 폴더에서 create_boards_table 파일을 열어서 수정해줍시다.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateBoardsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('boards', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->longText('story');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('boards');
    }
}

 

이렇게 작성한 후 터미널에

php artisan migrate를 입력해줍니다. (저는 xampp와 MySQL Workbench를 사용했습니다.)

 

tables

그럼 이렇게 boards 테이블이 생성됩니다.

 

app/Http/Controllers에 들어가서 BoardController.php을 열어서 아래와 같이 입렵해줍니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BoardController extends Controller
{
    public function index(){
        return view('boards.index');
    }
    
    public function create(){
        return view('boards.create');
    }
}

 

그리고 routes/web.php로 가서 아래와 같이 수정해줍니다.

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BoardController;

Route::get('/', function () {
    return view('home');
}) -> name('home');


Route::get('boards', [BoardController::class, 'index']) -> name('boards.index');
Route::get('boards/create', [BoardController::class, 'create']) -> name('boards.create');

//Route::get('boards', function (){
//    return view('boards.index');
//}) -> name('boards.index');
//
//Route::get('boards/create', function (){
//    return view('boards.create');
//}) -> name('boards.create');

 

주석 처리한 부분을 바꾼것입니다.

컨트롤러를 만들었으니 이제 주석부분은 지우고 위와 같이 작성하겠습니다.

 

다시 BoardController.php로 돌아가서 store 메소드를 만들어줍니다.

<?php

namespace App\Http\Controllers;

use App\Models\Board;
use Illuminate\Http\Request;

class BoardController extends Controller
{
    public function index(){
        return view('boards.index');
    }

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

    public function store(Request $request){
        $validation = $request -> validate([
            'title' => 'required',
            'story' => 'required'
        ]);

        $board = new Board();
        $board -> title = $validation['title'];
        $board -> story = $validation['story'];
        $board -> save();

        return redirect() -> route('boards.index');
    }
}

 

$validation은 유효성 검사를 하는 부분입니다.

제목과 내용부분을 작성하지 않으면 저장이 되지 않습니다.

 

더 자세한 유효성 검사는

https://laravel.kr/docs/8.x/validation#%EC%82%AC%EC%9A%A9%EA%B0%80%EB%8A%A5%ED%95%9C%20%EC%9C%A0%ED%9A%A8%EC%84%B1%20%EA%B2%80%EC%82%AC%20%EA%B7%9C%EC%B9%99

 

라라벨 8.x - Validation-유효성검사

라라벨 한글 메뉴얼 8.x - Validation-유효성검사

laravel.kr

라라벨 공식 문서를 확인해주세요.

 

$board = new Board(); 

이 부분부터는 라라벨에서 지원하는 Eloquent를 사용했습니다.

https://laravel.kr/docs/8.x/eloquent#introduction

 

라라벨 8.x - 시작하기

라라벨 한글 메뉴얼 8.x - 시작하기

laravel.kr

그리고 redirect() -> route('boards.index')를 이용해서 boards의 index화면으로 돌아가게했습니다.

 

다음으로 app/Models 폴더에 있는 Board.php 파일을 열어 아래와 같이 작성해줍니다.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Board extends Model
{
    use HasFactory;
    protected $fillable = ['title', 'story'];
}

 

 

routes/web.php로 들어가 route를 추가해줍니다.

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BoardController;

Route::get('/', function () {
    return view('home');
}) -> name('home');


Route::get('boards', [BoardController::class, 'index']) -> name('boards.index');
Route::get('boards/create', [BoardController::class, 'create']) -> name('boards.create');
Route::post('boards', [BoardController::class, 'store']) -> name('boards.store');

 

이제 글쓰기 화면으로 들어가 글을 작성해봅시다.

글쓰기

 

boards_table

boards 테이블에도 제대로 저장된 것을 볼 수 있습니다.