처음부터 차근차근

package 다운로드, 파일 명명 규칙, 리소스 컨트롤러, form 값 받기, db update/delete/create, fillable 본문

Framework/Laravel

package 다운로드, 파일 명명 규칙, 리소스 컨트롤러, form 값 받기, db update/delete/create, fillable

_soyoung 2022. 1. 16. 17:26
반응형

패키지 다운로드

프로젝트 파일에서 npm install을 하면 package.json의 devDependencies에 있는 패키지들을 설치 할 수 있다.

webpack.mix.js에서 코드를 작성하면 css파일이나 js파일을 컴파일하여 사용할 수 있다.

webpack.mix.js에 적혀있는 css or js 컴파일 하는 코드

npm run dev

resource 폴더 안에 있는 css파일 js 파일이 컴파일 되면 public 폴더 밑에 새로 파일이 생긴다.

 

 

 

파일 명명 규칙

controller : 맨 앞 문자 대문자로, 단수형 ex) BookController

model : 맨 앞 문자 대문자로, 단수형 ex) Book

table : 복수형 ex) books

migration : 날짜(자동으로 정해줌)_create_테이블명_table.php

 

 

 

 

라라벨에서 추천하는 CRUD 개발 방식

전송 방식 url 함수 이름 view 파일 이름(경로)
GET /photos   (book list) index photos.index
GET /photos/create  (book 생성 페이지) create photos.create
POST /photos   (book 실제로 생성하는 로직) store photos.store
GET /photos/{photo}  (book detail) show photos.show
GET /photos/{photo}/edit  (book 수정 페이지) edit photos.edit
PUT/PATCH /photos/{photo}   (book 실제로 수정하는 로직) update photos.update
DELETE /photos/{photo}  (book 삭제하는 로직) destroy comments.destroy

controller 안에다 함수를 하나하나 직접 만들어서 구현하는 것도 좋지만 라라벨에서 지원하는 리소스 컨트롤러를 이용하면 함수가 자동으로 만들어져서 controller가 만들어진다.

php artisan make:controller 컨트롤러명 --resource

 

 

 

form에서 post로 넘어온 값 받고 저장하기

Route::post('/books', [BookController::class, 'store']);
public function store(Request $request)
{
	// Book 모델의 create함수를 이용하여 books 테이블에 값 넣기
    $book = Book::create([ // 새로 생성된 레코드들이 book변수에 대입됨
        'title'=>$request->input('title'), // form name으로 값 받기
        //'title'=>request('title') 도 됨
        'content'=>$request->input('content')
    ]);
    // 같음 $book = Book::create(request(['title', 'content']));

    return redirect('/books');
}

form에서 csrf 추가

model에다 fillable 추가

 

 

 

CSRF

csrf란, 크로스-사이트 요청 위조 공격이다.

라라벨은 csrf로부터 애플리케이션을 보호할 수 있는 기능을 제공하기 때문에 form에서 값을 넘기려면 이 기능을 꼭 사용해야한다.

 

웹페이지의 헤더 안에다 아래의 코드를 추가한다.

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

 

그리고 form 안에다가 @csrf 키워드를 추가한다.

<form action="/books" method="POST">
    @csrf
    ...생략
</form>

 

 

 

fillable

모델 파일안에다 데이터베이스에 insert or update할 수 있는 필드를 정하는 것이다.

모델 파일 안에 fillable을 정하지 않으면 오류가 난다.

protected $fillable = ['title', 'content'];

<->

guarded 

fillable과 반대로 해당 필드를 db에 insert or update 못하게 하는 것이다.

protected $guarded = ['title', 'content'];

 

 

 

get 방식 값 받는 법

url : /books/2

web.php :

Route::get('/books/{book}', [BookController::class, 'show']);

controller : (같은 변수명으로 받아야한다.)

public function show($book)
{
    return view('books.show',['book'=>$book]);
}

이렇게 하면 $book에 2가 들어가서 show에서 $book으로 2를 출력할 수 있음.

public function show(Book $book)
{
    return view('books.show',['book'=>$book]);
}

이렇게 하면 id가 2인 books 테이블의 레코드를 가져올 수 있음.(모든 값! title, content...등)

 

 

 

form 데이터 PUT 방식으로 보내기

CRUD에서 U 부분 만들 때 PUT 방식으로 보내야 하는데 form method를 post로 놓은 상태에서 @method('PUT') 키워드를 추가하면 된다.

 <form action="/books/{{ $book->id }}" method="POST">
    @csrf
    @method('PUT')
    ...생략
 </form>
Route::put('/books/{book}', [BookController::class, 'update']);

 

 

db 데이터 update 하기

public function update(Book $book)
{
    $book->update([
        'title'=>request('title'),
        'content'=>request('content')
    ]);
    return redirect('/books/'.$book->id);
}

 

 

 

db 데이터 delete하기

DELETE 방식으로 데이터를 보낸다.

<form action="/books/{{ $book->id }}" method="post">
    @csrf
    @method('DELETE')
    <input type="submit" class="btn btn-outline-danger">삭제</button>
</form>

web.php : 

Route::delete('/books/{book}', [BookController::class, 'destroy']);

controller : 

public function destroy(Book $book)
{
    $book->delete();
    return redirect('/books');
}

 

 

반응형
Comments