Laravel 8 - CRUD(2)
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를 사용했습니다.)
그럼 이렇게 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은 유효성 검사를 하는 부분입니다.
제목과 내용부분을 작성하지 않으면 저장이 되지 않습니다.
더 자세한 유효성 검사는
라라벨 공식 문서를 확인해주세요.
$board = new Board();
이 부분부터는 라라벨에서 지원하는 Eloquent를 사용했습니다.
https://laravel.kr/docs/8.x/eloquent#introduction
그리고 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 테이블에도 제대로 저장된 것을 볼 수 있습니다.