이번에는 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
https://laravel.kr/docs/6.x/controllers
이제 본격적으로 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로 가서 글을 작성해줍니다.
작성을 누르면
이렇게 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 |
댓글