Laravel 9 CRUD 초급 예제
- Laravel 9 CRUD 초급 예제 1부 : Setting & Create- Laravel 9 CRUD 초급 예제 2부 : Read & Update & Delete
- Laravel 9 CRUD 예제 3부 : 페이지네이션(Pagination)
- Laravel 9 CRUD 예제 4부 : 유효성 검사(Validation)
라라벨 공부
Step 1. Project Setting
프로젝트를 만들 폴더로 옮긴 후 프로젝트 생성 명령어 입력, dev_seung 부분은 프로젝트 명이며 뒤에 숫자는 라라벨의 버전입니다, 뒤 숫자를 변경하면 라라벨의 버전을 바꿀 수 있습니다.
composer create-project laravel/laravel dev_seung "9.*"
※ composer : php에서 사용하는 패키지 및 라이브러를 관리해줍니다. (node의 npm)
.env 파일에 데이터베이스 정보 입력
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:yXz/0nPARHiPPIuPe87zvDe0RiqtpX9kEjzlyJVzNS8=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
저의 경우 아래와 DB 부분 만을 아래와 같이 수정했습니다.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dev_seung
DB_USERNAME=homestead
DB_PASSWORD=secret
데이터베이스 연결 후
프로젝트 폴더에서 아래 명령어를 입력하여 라라벨에 필요한 라이브러리와 패키지를 다운로드하여 줍시다.
composer install
이제 아래 명령어 입력 또는 홈스테드로 등록한 가상 호스트로 들어가시면 Laravel 9 기본 화면을 보실 수 있습니다.
php artisan serve
Step 2. Migration & Model&Controller
Migration : DB 스키마 정의
Model : DB 접근 객체
Controller : 실질적인 백엔드 작업
위의 3가지 종류의 파일은 아래와 같은 명령어들로 각각 생성할 수 있습니다
php artisan make:migration create_products_table
php artisan make:model Product
php artisan make:controller ProductController
또는 아래 명령어로 하나로 만들 수 있습니다.
php artisan make:model product -mc
그러면 각 위치에 파일이 추가될 것 입니다.
Model : app/Models/product.php
Migration : database/migrations/2022_08_09_060643_create_products_table.php (파일명은 시간에 따라 달라집니다.)
Controller : app/Http/Controller/ProductController
Step 3. Index (리스트)
우리는 제품을 등록하는 사이트를 만들어볼까 합니다.
우선 이전에 명령어로 생성한 2022_08_09_060643_create_products_table를 열어서 아래와 같이 수정해줍니다.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up() // php artisan migrate 시 실행되는 함수
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name', 64);
$table->string('content', 256);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down() // php artisan migrate:rollback 시 사용되는 함수, 해당 테이블명을 삭제함
{
Schema::dropIfExists('products');
}
};
위 코드 입력 후 아래 명령어로 migration을 실행시키면 데이터베이스에 테이블이 생성됩니다.
php artisan migrate
이제 테이블이 완성되었으니 테이블을 가져올 ProductController를 수정해줍시다.
<?php
namespace App\Http\Controllers;
use App\Models\product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
private $product;
public function __construct(product $product){
// Laravel 의 IOC(Inversion of Control) 입니다
// 일단은 이렇게 모델을 가져오는 것이 추천 코드라고 생각하시면 됩니다.
$this->product = $product;
}
public function index(){
// products 의 데이터를 최신순으로 페이징을 해서 가져옵니다.
$products = $this->product->latest()->paginate(10);
// produce/index.blade 에 $products 를 보내줍니다
return view('products.index', compact('products')); //
}
}
이제 사용자의 요청에 따라 어느 Controller로 동작할지 정해주는 Route 설정을 해줍시다.
/routes/web 폴더를 보시면 여러 가지 파일이 있을 텐데, 우리가 수정할 파일은 web.php입니다.
<?php
use Illuminate\Support\Facades\Route;
use \App\Http\Controllers\ProductController;
// 아까 우릴 환영해주던 라라벨 기본 화면에 대한 라우팅 설정입니다.
Route::get('/', function () {
return view('welcome');
});
// products 로 get 요청이 올 경우 ProductController 의 index 함수를 실행합니다.
// name 은 별명으로 나중에 route('product.index') 로 쉽게 주소 출력이 가능합니다.
Route::get('/products', [ProductController::class, 'index'])->name('products.index');
이제 ProductController에서 사용할 view를 만들어 줍시다
- resources/views/product/layout.blade.php
<!doctype html>
<html lang="kr">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<title>Product</title>
</head>
<body>
<div class="container">
@yield('content')
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
</body>
</html>
- resources/views/product/index.blade.php
{{-- layout 으로 --}}
@extends('products.layout')
{{-- 아래 html 을 @yield('content') 에 보낸다고 생각하시면 됩니다. --}}
@section('content')
<h2 class="mt-4 mb-3">Product List</h2>
<a href="{{route("products.create")}}">
<button type="button" class="btn btn-dark" style="float: right;">Create</button>
</a>
<table class="table table-striped table-hover">
<colgroup>
<col width="15%"/>
<col width="55%"/>
<col width="15%"/>
<col width="15%"/>
</colgroup>
<thead>
<tr>
<th scope="col">Number</th>
<th scope="col">Name</th>
<th scope="col">Created At</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{{-- blade 에서는 아래 방식으로 반복문을 처리합니다. --}}
{{-- Product Controller의 index에서 넘긴 $products(product 데이터 리스트)를 출력해줍니다. --}}
@foreach ($products as $key => $product)
<tr>
<th scope="row">{{$key+1 + (($products->currentPage()-1) * 10)}}</th>
<td>{{$product->name}}</td>
<td>{{$product->created_at}}</td>
<td>Edit/Delete</td>
</tr>
@endforeach
</tbody>
</table>
{{-- 라라벨 기본 지원 페이지네이션 --}}
{!! $products->links() !!}
@endsection
이제 주소/products 페이지에 접속하면 아래와 같은 화면이 나올 것입니다.
아직 데이터가 없어서 빈 화면에 가깝습니다.
Step 4. Create (생성)
ProductController에 create와 store메서드를 선언합니다.
class ProductController extends Controller
{
...
public function index(){
...
}
public function create(){
return view('products.create');
}
public function store(Request $request)
{
// Request 에 대한 유효성 검사입니다, 다양한 종류가 있기에 공식문서를 보시는 걸 추천드립니다.
// 유효성에 걸린 에러는 errors 에 담깁니다.
$request = $request->validate([
'name' => 'required',
'content' => 'required'
]);
$this->product->create($request);
return redirect()->route('products.index');
}
}
web.php에 아래 코드를 추가합니다
Route::get('/products/create', [ProductController::class, 'create'])->name('products.create');
// store 요청은 form 을 통해 post 로 옵니다.
Route::post('/products/store', [ProductController::class, 'store'])->name('products.store');
resources/views/product/create.blade.php을 추가합니다.
{{-- layout 으로 --}}
@extends('products.layout')
{{-- 아래 html 을 @yield('content') 에 보낸다고 생각하시면 됩니다. --}}
@section('content')
<h2 class="mt-4 mb-3">Product Create</h2>
{{-- 유효성 검사에 걸렸을 경우 --}}
@if ($errors->any())
<div class="alert alert-warning" role="alert">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{route('products.store')}}" method="post">
{{-- 라라벨은 CSRF로 부터 보호하기 위해 데이터를 등록할 때의 위조를 체크 하기 위해 아래 코드가 필수 --}}
@csrf
<div class="mb-3">
<label for="name" class="form-label">Name</label>
<input type="text" name="name" class="form-control" id="name" autocomplete="off">
</div>
<div class="mb-3">
<label for="content" class="form-label">Content</label>
<textarea rows="10" cols="40" name="content" class="form-control" id="name" autocomplete="off"></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
@endsection
products에 데이터를 추가하기 위해서는 app/Models/product.php를 아래와 같이 수정해야 합니다.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class product extends Model
{
use HasFactory;
// 대량 할당이 가능하도록 하는 것, $guarded 와 같이 쓸 수 없지만
// 둘 중 하나는 사용해야 데이터 추가가 가능합니다, 두 변수를 비교해서 공부하시기를 추천드립니다.
protected $fillable = [
'name', 'content'
];
}
이제 아래와 같은 기능이 가능할 것입니다.
중간에 막히는 부분이 있을 경우 자유롭게 댓글 남겨주세요.
'PHP > Laravel' 카테고리의 다른 글
Laravel 9 CRUD 예제 3부 : 페이지네이션(Pagination) (0) | 2022.08.10 |
---|---|
Laravel 9 CRUD 초급 예제 2부 : Read & Update & Delete (0) | 2022.08.10 |
Laravel 테이블에 복합키로 Unique 속성 주기 (0) | 2022.07.22 |
phpstorm 이미지 주소 정규식 검색 후 변경 (0) | 2022.07.20 |
phpstorm + vagrant + xdebug 세팅 (0) | 2022.04.21 |