본문 바로가기
IT/PHP

PHP/Laravel(8) CRUD#1

by Sungjun_ 2020. 2. 22.

이번에는 CRUD 중에서 C만 먼저 해보겠습니다.

 

앞에서 migration, model, controller를 각각 따로 만들었는데

한번에 만들 수 있는 명령어가 있었습니다.

 

먼저 터미널에 php artisan make:model --help

이렇게 입력해주면

이렇게 사용하는 방법과 추가적으로 사용할 수 있느 옵션이 나옵니다.

그리고 저기 옵션에 보면 -c, -m이 있는데 컨트롤러와 마이그레이션도 함께 만들 수 있습니다.

 

터미널에 php artisan make:model -m -c Board

이렇게 입력해주면

한번에 모델과 마이그레이션, 컨트롤러가 생성된 것을 확인할 수 있습니다.

 

모델은 app 폴더 안에 Board.php로 생성되고

모델

 

컨트롤러는 app >> Http >> Controllers 폴더 안에 BoardController.php로 생성됩니다.

컨트롤러

마이그레이션은 database >> migrations 폴더 안에 생성됩니다.

마이그레이션

 

보시면 모델과 컨트롤러는 단수형으로 마이그레이션은 복수형으로 표현되는데

이렇게 표현하는 것이 라라벨에서 추천하는 방법이라고합니다.

 

이제

resources >> views 폴더 안에 boards 폴더를 만들어줍니다.

그리고 boards 폴더의 메인 페이지로 사용할 index.blade.php를 만들어줍니다.

 

 

layouts 폴더에 index.blade.php가 상속 받을 master.blade.php를 만들어줍니다.

 

<!DOCTYPE html>
<html lang="kr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta name="csrf-token" content="{{ csrf_token()}}">
    <title>@yield('title', 'Laravel')</title>
</head>
<body>
    <div>
    @yield('content')
    </div>
</body>
</html>

<meta name="csrf-token" content="{{ csrf_token()}}">

이 부분은 뒤에서 설명하겠습니다.

 

타이틀 태그 안에 보시면 'title'말고 'Laravel'이 있는데 title 값을 주지 않았을 때

기본 값으로 Laravel을 주는 것입니다.

 

그리고  index.blade.php입니다.

@extends('layouts.master')

@section('title')
    Board Index
@endsection

@section('content')
    Board Index
@endsection

 

index를 화면에 출력해야 하기 때문에 routes 폴더의 web.php로 들어가 코드를 추가해줍니다.

 

<?php

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

 

이렇게 입력을 해주고

주소창에 http://localhost:8000/boards 이렇게 입력을 해주면

화면에 이렇게

 

Board Index만 나오는 것을 볼 수 있습니다.

 

들어가기 앞서 아래 링크를 참고하시면 좋습니다.

https://laravel.kr/docs/6.x/csrf

 

라라벨 6.x - CSRF 보호하기

라라벨 한글 메뉴얼 6.x - CSRF 보호하기

laravel.kr

https://laravel.kr/docs/6.x/controllers

 

라라벨 6.x - 컨트롤러

라라벨 한글 메뉴얼 6.x - 컨트롤러

laravel.kr

 

이제 본격적으로 CRUD 중 C를 만들어 보겠습니다.

 

database >> migrations 폴더 안에 있는 boards 테이블을 수정하겠습니다.

 

<?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->bigIncrements('id');
            $table->string('title');
            $table->longText('story');
            $table->timestamps();
        });
    }

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

 

이렇게 입력을 합니다.

콜롬에 제목과 본문을 저장할 title과 story를 추가했습니다.

 

이제 php artisan migrate를 하여 DB에 추가해줍니다.

 

 

이렇게 추가된 것을 볼 수 있습니다.

참고로 제가 사용하는 프로그램은 MySQL Workbench입니다.

 

그리고 resources >> views 폴더 안에 글을 작성할 페이지로 create.blade.php를 만들어줍니다.

 

@extends('layouts.master')

@section('title')
    Create Boards
@endsection

@section('content')
    <form action="/boards" method="POST">
        @csrf
        <label for="title">제목</label>
        <p><input type="text" name="title" id="title"></p>
        <p><label for="story">본문</label><p>
        <p><textarea name="story" id="story"cols="30" rows="10"></textarea></p>
        <input type="submit" value="작성">
    </form>
@endsection

@section('content') 안에

form태그 안에 @csrf를 넣어주고 작성합니다.

 

web.php에 가서

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

위와 같이 입력해줍니다.

 

그리고 주소창에 http://localhost:8000/boards/create

이렇게 입력하시면

 

위와 같이 화면이 나옵니다.

 

글 저장에 들어가기 앞서 web.php와 BoardController.php를 수정하겠습니다.

 

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');
    }
}

 

 

그리고 web.php를

 

<?php

Route::get('/boards', 'BoardController@index');
Route::get('/boards/create', 'BoardController@create');

 

이렇게 수정해줍니다.

 

이제 작성한 글을 저장하는 기능을 만들겠습니다.

 

 

라라벨 코리아 가이드에서 컨트롤러 부분 안에 있는 표입니다.

저 표를 보시면 아래 작성할 store 코드를 이해하시는데 도움이 될 것입니다.

 

store는 따로 blade 템플릿을 만들지 않고 

BoardController.php에 작성합니다.

 

<?php

namespace App\Http\Controllers;

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

class BoardController extends Controller
{
    public function index(){

        return view('boards.index');
    }

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

    public function store(Request $request){
        $board = Board::create([
            'title'=>$request->input('title'),
            'story'=>$request->input('story')
        ]);
        return redirect('/boards');
    }
}

 

 

위쪽에 보시면 user 부분에 App\Board가 추가됐는데

app 폴더 안에 있는 Board.php 모델을 사용한다는 것입니다.

 

그리고 아래 쪽에 store 함수를 추가했습니다.

Request를 create페이지에서 보내오는 값을 받는다고 생각하시면 됩니다.

$board는 Board 모델에 title과 story를 넣어 글을 저장시킨 것을

$board에도 저장시킨 것입니다.

redirect는 글을 저장하고 /boards의 메인화면인 index로 돌아가게 한 것입니다.

 

그리고 app 폴더의 Board.php로 가서 

 

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

 

이렇게 추가해줍니다.

 

마지막으로 web.php에 가서 라우트를 추가해줍니다.

<?php

Route::get('/boards', 'BoardController@index');
Route::get('/boards/create', 'BoardController@create');
Route::post('/boards','BoardController@store');

 

store는 get이 아닌 post로 하셔야합니다.

 

 

이제 boards 테이블에 제대로 저장이 되는지 확인해봅시다.

 

/boards/create로 가서 글을 작성해줍니다.

 

 

작성을 누르면

 

/boards

 

이렇게 index 페이지로 돌아옵니다.

DB에서 boards 테이블을 확인해보면

 

제대로 저장됐습니다.

이제 index 화면에 작성한 글을 목록으로 받아보겠습니다.

 

BoardController.php에서  index 함수를 수정해줍니다.

 

<?php

namespace App\Http\Controllers;

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

class BoardController extends Controller
{
    public function index(){
        $boards = Board::all();
        return view('boards.index',compact('boards'));
    }

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

    public function store(Request $request){

        $board = Board::create([
            'title'=>$request->input('title'),
            'story'=>$request->input('story')
        ]);
        return redirect('/boards');
    }
}

 

$boards에 boards 테이블의 모든 정보를 저장시킵니다.

 

index.blade.php에 코드를 추가합니다.

@extends('layouts.master')

@section('title')
    Board Index
@endsection

@section('content')
    <p>Board Index</p>
    @foreach ($boards as $item)
        {{$item}}
    @endforeach

@endsection

 

그러면

 

 

이렇게 화면이 나오는데 title값만 가지고 와보겠습니다.

 

index.blade.php를 아래와 같이 수정해주면

@extends('layouts.master')

@section('title')
    Board Index
@endsection

@section('content')
    <p>Board Index</p>
    @foreach ($boards as $item)
        Title : {{$item -> title}}
    @endforeach

@endsection

 

이렇게 title 값만 가지고 오는 것을 볼 수 있습니다.

 

 

CRUD 중 C는 이것으로 마치고 

다음에는 R을 해보겠습니다.

'IT > PHP' 카테고리의 다른 글

PHP/Laravel(10) CRUD#3  (0) 2020.02.23
PHP/Laravel(9) CRUD#2  (0) 2020.02.22
PHP/Laravel(7) 모델  (0) 2020.02.21
PHP/Laravel(6) 데이터베이스 연결 및 생성  (0) 2020.02.21
PHP/Laravel(5) 컨트롤러  (0) 2020.02.21

댓글