Laravel 초급 태스크 목록 편집하기

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
11번째 줄: 11번째 줄:


==설치==
==설치==
[[Laravel Homestead|Homestead 가상머신]]을 사용하거나 선택한 로컬 PHP 환경을 사용하여 프레임워크를 실행할 수 있습니다. 여기서는 도커 기반 실습환경에서 진행합니다.
우선, Laravel 프레임워크을 새로 설치해야 합니다. [[Laravel Homestead|Homestead 가상머신]]을 사용하거나 선택한 로컬 PHP 환경을 사용하여 프레임워크를 실행할 수 있습니다. 로컬 환경이 준비되면 Composer를 사용하여 Laravel 프레임워크를 설치할 수 있습니다:
 
===도커 기반 실습환경 (선택사항)===
<syntaxhighlight lang='bash'>
mkdir ~/workspace
cd ~/workspace
docker run --name laravel --rm -it -v ${PWD}:/workspace -w /workspace --network host -h docker --entrypoint="" bitnami/laravel bash
</syntaxhighlight>
<syntaxhighlight lang='console'>
root@wsl:~# mkdir ~/workspace
root@wsl:~# cd ~/workspace
root@wsl:~/workspace$ docker run --name laravel --rm -it -v ${PWD}:/workspace -w /workspace --network host -h docker --entrypoint="" bitnami/laravel bash
Unable to find image 'bitnami/laravel:latest' locally
latest: Pulling from bitnami/laravel
3b20dd80ae86: Pull complete
Digest: sha256:d16af27a0d4c2f6f3f71c730d7def97de91e0b2ea0233e84dc758340521b1629
Status: Downloaded newer image for bitnami/laravel:latest
root@docker:/workspace#
</syntaxhighlight>
 
===Laravel 설치===
환경이 준비되면 Composer를 사용하여 Laravel 프레임워크를 설치할 수 있습니다:


<syntaxhighlight lang='bash'>
<syntaxhighlight lang='bash'>
composer create-project laravel/laravel quickstart --prefer-dist
composer create-project laravel/laravel quickstart --prefer-dist
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang='console'>
root@docker:/workspace# composer create-project laravel/laravel quickstart --prefer-dist
Creating a "laravel/laravel" project at "./quickstart"
Installing laravel/laravel (v11.1.1)
...
  INFO  Preparing database.
  Creating migration table ................................................... 7.50ms DONE
  INFO  Running migrations.
  0001_01_01_000000_create_users_table ...................................... 25.95ms DONE
  0001_01_01_000001_create_cache_table ....................................... 8.63ms DONE
  0001_01_01_000002_create_jobs_table ....................................... 21.42ms DONE
</syntaxhighlight>
<syntaxhighlight lang='console'>
root@docker:/workspace# cd quickstart/
root@docker:/workspace/quickstart# find app/ routes/ resources/ | grep .php
app/Providers/AppServiceProvider.php
app/Http/Controllers/Controller.php
app/Models/User.php
routes/console.php
routes/web.php
resources/views/welcome.blade.php
</syntaxhighlight>
{{소스헤더|개발서버 실행}}
<syntaxhighlight lang='console'>
root@docker:/workspace/quickstart# php artisan serve
  INFO  Server running on [http://127.0.0.1:8000].
  Press Ctrl+C to stop the server
^C
</syntaxhighlight>
'''참고''': [[composer create-project laravel/laravel quickstart --prefer-dist]]
[[파일:Fresh-dark.png|640px]]
===vscode 실행 (선택사항)===
<syntaxhighlight lang='console'>
root@wsl:~# code ~/workspace/quickstart/
root@wsl:~#
</syntaxhighlight>
wsl에서는 docker와 디렉토리를 공유합니다. 따라서 vscode에서 파일 편집은 가능하지만 Artisan CLI 명령어는 실행할 수 없습니다. Artisan CLI 명령어는 docker 컨테이너 내부에서 실행해야 합니다.


==데이터베이스 준비==
==데이터베이스 준비==
95번째 줄: 25번째 줄:
<syntaxhighlight lang='bash'>
<syntaxhighlight lang='bash'>
php artisan make:migration create_tasks_table --create=tasks
php artisan make:migration create_tasks_table --create=tasks
</syntaxhighlight>
<syntaxhighlight lang='console'>
$ php artisan make:migration create_tasks_table --create=tasks
  INFO  Migration [database/migrations/2024_06_15_101234_create_tasks_table.php] created successfully.
</syntaxhighlight>
</syntaxhighlight>


마이그레이션 파일은 프로젝트의 <code>database/migrations</code> 디렉토리에 생성됩니다. 아마도 <code>make:migration</code> 명령어가 이미 자동 증가 ID와 타임스탬프를 마이그레이션 파일에 추가한 것을 보셨을 것입니다. 이 파일을 편집하여 작업 이름을 위한 <code>name</code> 문자열 컬럼을 추가해봅시다:
마이그레이션 파일은 프로젝트의 <code>database/migrations</code> 디렉토리에 생성됩니다. 아마도 <code>make:migration</code> 명령어가 이미 자동 증가 ID와 타임스탬프를 마이그레이션 파일에 추가한 것을 보셨을 것입니다. 이 파일을 편집하여 작업 이름을 위한 <code>name</code> 문자열 컬럼을 추가해봅시다:


{{소스헤더|database/migrations/2024_06_15_101234_create_tasks_table.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php' highlight='16'>
<?php
<?php


use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;


return new class extends Migration
class CreateTasksTable extends Migration
{
{
     /**
     /**
     * Run the migrations.
     * 마이그레이션을 실행합니다.
    *
    * @return void
     */
     */
     public function up(): void
     public function up()
     {
     {
         Schema::create('tasks', function (Blueprint $table) {
         Schema::create('tasks', function (Blueprint $table) {
             $table->id();
             $table->increments('id');
             $table->string('name');
             $table->string('name');
             $table->timestamps();
             $table->timestamps();
127번째 줄: 52번째 줄:


     /**
     /**
     * Reverse the migrations.
     * 마이그레이션을 되돌립니다.
    *
    * @return void
     */
     */
     public function down(): void
     public function down()
     {
     {
         Schema::dropIfExists('tasks');
         Schema::drop('tasks');
     }
     }
};
}
</syntaxhighlight>
</syntaxhighlight>


140번째 줄: 67번째 줄:
<syntaxhighlight lang='bash'>
<syntaxhighlight lang='bash'>
php artisan migrate
php artisan migrate
</syntaxhighlight>
<syntaxhighlight lang='console'>
$ php artisan migrate
  INFO  Running migrations.
  2024_06_15_101234_create_tasks_table ....................................... 9.24ms DONE
</syntaxhighlight>
</syntaxhighlight>


159번째 줄: 79번째 줄:
php artisan make:model Task
php artisan make:model Task
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang='console'>
$ php artisan make:model Task


  INFO  Model [app/Models/Task.php] created successfully.
모델은 애플리케이션의 <code>app</code> 디렉토리에 배치됩니다. 기본적으로 모델 클래스는 비어 있습니다. Eloquent 모델에 어떤 테이블과 대응되는지 명시적으로 알릴 필요는 없습니다. 왜냐하면 Eloquent는 모델 이름의 복수형을 데이터베이스 테이블로 가정하기 때문입니다. 따라서, <code>Task</code> 모델은 <code>tasks</code> 데이터베이스 테이블과 대응되는 것으로 간주됩니다. 빈 모델은 다음과 같이 생겼습니다:
</syntaxhighlight>


모델은 애플리케이션의 <code>app/Models</code> 디렉토리에 배치됩니다. 기본적으로 모델 클래스는 비어 있습니다. Eloquent 모델에 어떤 테이블과 대응되는지 명시적으로 알릴 필요는 없습니다. 왜냐하면 Eloquent는 모델 이름의 복수형을 데이터베이스 테이블로 가정하기 때문입니다. 따라서, <code>Task</code> 모델은 <code>tasks</code> 데이터베이스 테이블과 대응되는 것으로 간주됩니다. 빈 모델은 다음과 같이 생겼습니다:
{{소스헤더|app/Models/Task.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
<?php
<?php
 
namespace App\Models;
namespace App;
 
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Model;
 
class Task extends Model
class Task extends Model
{
{
     use HasFactory;
     //
}
}
</syntaxhighlight>
</syntaxhighlight>
187번째 줄: 99번째 줄:
==라우팅==
==라우팅==
===라우트 스터빙===
===라우트 스터빙===
다음으로, 애플리케이션에 몇 가지 라우트를 추가할 준비가 되었습니다. 라우트는 URL을 컨트롤러나 사용자가 특정 페이지에 액세스할 때 실행해야 하는 익명 함수로 연결하는 데 사용됩니다. 기본적으로 모든 Laravel 라우트는 새로운 프로젝트에 포함된 <code>routes</code> 디렉토리에 정의됩니다.
다음으로, 애플리케이션에 몇 가지 라우트를 추가할 준비가 되었습니다. 라우트는 URL을 컨트롤러나 사용자가 특정 페이지에 액세스할 때 실행해야 하는 익명 함수로 연결하는 데 사용됩니다. 기본적으로 모든 Laravel 라우트는 새로운 프로젝트에 포함된 <code>app/Http/routes.php</code> 파일에 정의됩니다.


이 애플리케이션에서는 최소한 세 개의 라우트가 필요하다는 것을 알고 있습니다. 모든 태스크 목록을 표시하는 라우트, 새로운 태스크를 추가하는 라우트, 기존 태스크를 삭제하는 라우트가 필요합니다. 따라서, <code>routes/web.php</code> 파일에 이러한 모든 라우트를 스터빙해 보겠습니다:
이 애플리케이션에서는 최소한 세 개의 라우트가 필요하다는 것을 알고 있습니다. 모든 태스크 목록을 표시하는 라우트, 새로운 태스크를 추가하는 라우트, 기존 태스크를 삭제하는 라우트가 필요합니다. 따라서, <code>app/Http/routes.php</code> 파일에 이러한 모든 라우트를 스터빙해 보겠습니다:


{{소스헤더|routes/web.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
<?php
<?php


use Illuminate\Support\Facades\Route;
use App\Task;
use Illuminate\Http\Request;


/**
/**
  * Show Task Dashboard
  * 작업 대시보드 표시
  */
  */
Route::get('/', function () {
Route::get('/', function () {
205번째 줄: 117번째 줄:


/**
/**
  * Add New Task
  * 새 작업 추가
  */
  */
Route::post('/task', function (Request $request) {
Route::post('/task', function (Request $request) {
212번째 줄: 124번째 줄:


/**
/**
  * Delete Task
  * 작업 삭제
  */
  */
Route::delete('/task/{task}', function (Task $task) {
Route::delete('/task/{task}', function (Task $task) {
218번째 줄: 130번째 줄:
});
});
</syntaxhighlight>
</syntaxhighlight>
{{NOTE}}
만약 여러분의 Laravel 버전에 이미 기본 라우트 파일을 <code>web</code> 미들웨어 그룹 내에 포함하는 <code>RouteServiceProvider</code>가 있다면, <code>routes.php</code> 파일에 그룹을 수동으로 추가할 필요가 없습니다.
{{/NOTE}}


===뷰 표시하기===
===뷰 표시하기===
224번째 줄: 140번째 줄:
Laravel에서는 모든 HTML 템플릿이 <code>resources/views</code> 디렉토리에 저장되며, <code>view</code> 헬퍼를 사용하여 해당 라우트에서 이 템플릿 중 하나를 반환할 수 있습니다:
Laravel에서는 모든 HTML 템플릿이 <code>resources/views</code> 디렉토리에 저장되며, <code>view</code> 헬퍼를 사용하여 해당 라우트에서 이 템플릿 중 하나를 반환할 수 있습니다:


{{소스헤더|routes/web.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php' highlight='2'>
Route::get('/', function () {
Route::get('/', function () {
     return view('tasks');
     return view('tasks');
245번째 줄: 160번째 줄:
우리의 <code>app.blade.php</code> 뷰는 다음과 같이 생겼습니다:
우리의 <code>app.blade.php</code> 뷰는 다음과 같이 생겼습니다:


{{소스헤더|resources/views/layouts/app.blade.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
<!-- resources/views/layouts/app.blade.php -->
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<html lang="en">
     <head>
     <head>
         <title>Laravel Quickstart - Basic</title>
         <title>Laravel Quickstart - Basic</title>
         <link rel="stylesheet" href="https://unpkg.com/bootstrap@5/dist/css/bootstrap.min.css">
 
         <!-- CSS And JavaScript -->
     </head>
     </head>


     <body>
     <body>
         <nav class="navbar navbar-light bg-light border-bottom">
         <div class="container">
             <div class="container-fluid">
             <nav class="navbar navbar-default">
                 Task List
                 <!-- Navbar Contents -->
             </div>
             </nav>
         </nav>
         </div>


         @yield('content')
         @yield('content')
273번째 줄: 190번째 줄:
Bootstrap CSS 보일러플레이트 일부는 생략하고 중요한 부분만 다루겠습니다. 이 애플리케이션의 전체 소스코드는 [https://github.com/laravel/quickstart-basic GitHub]에서 다운로드할 수 있습니다:
Bootstrap CSS 보일러플레이트 일부는 생략하고 중요한 부분만 다루겠습니다. 이 애플리케이션의 전체 소스코드는 [https://github.com/laravel/quickstart-basic GitHub]에서 다운로드할 수 있습니다:


{{소스헤더|resources/views/tasks.blade.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
<!-- resources/views/tasks.blade.php -->
@extends('layouts.app')
@extends('layouts.app')


280번째 줄: 198번째 줄:


     <!-- Bootstrap Boilerplate... -->
     <!-- Bootstrap Boilerplate... -->
    <div class="card m-3">
        <div class="card-header">
            New Task
        </div>


        <div class="card-body">
    <div class="panel-body">
            <!-- Display Validation Errors -->
        <!-- Display Validation Errors -->
            @include('common.errors')
        @include('common.errors')
 
        <!-- New Task Form -->
        <form action="{{ url('task') }}" method="POST" class="form-horizontal">
            {{ csrf_field() }}


             <!-- New Task Form -->
             <!-- Task Name -->
             <form action="{{ url('task') }}" method="POST" class="form-horizontal">
             <div class="form-group">
                {{ csrf_field() }}
                <label for="task" class="col-sm-3 control-label">Task</label>


                <!-- Task Name -->
                 <div class="col-sm-6">
                 <div class="mb-3">
                     <input type="text" name="name" id="task-name" class="form-control">
                    <label for="task">Task</label>
                     <input type="text" name="name" id="task" class="form-control">
                 </div>
                 </div>
            </div>


                <!-- Add Task Button -->
            <!-- Add Task Button -->
                 <button type="submit" class="btn btn-primary">
            <div class="form-group">
                    Add Task
                 <div class="col-sm-offset-3 col-sm-6">
                 </button>
                    <button type="submit" class="btn btn-default">
             </form>
                        <i class="fa fa-plus"></i> Add Task
         </div>
                    </button>
                 </div>
             </div>
         </form>
     </div>
     </div>


314번째 줄: 234번째 줄:
이 템플릿에 대해 조금 더 설명하겠습니다. 먼저, <code>@extends</code> 지시어는 Blade에게 우리가 <code>resources/views/layouts/app.blade.php</code>에 정의한 레이아웃을 사용하고 있음을 알립니다. <code>@section('content')</code>와 <code>@endsection</code> 사이의 모든 내용은 <code>app.blade.php</code> 레이아웃의 <code>@yield('content')</code> 지시어 위치에 삽입됩니다.
이 템플릿에 대해 조금 더 설명하겠습니다. 먼저, <code>@extends</code> 지시어는 Blade에게 우리가 <code>resources/views/layouts/app.blade.php</code>에 정의한 레이아웃을 사용하고 있음을 알립니다. <code>@section('content')</code>와 <code>@endsection</code> 사이의 모든 내용은 <code>app.blade.php</code> 레이아웃의 <code>@yield('content')</code> 지시어 위치에 삽입됩니다.


<code>@include('common.errors')</code> 지시어는 <code>resources/views/common/errors.blade.php</code>에 위치한 템플릿을 로드합니다. 이 템플릿은 아직 정의하지 않았지만, 곧 정의할 것입니다!
<code>@include('common.errors')</code> 지시어는 <code>resources/views/common/errors.blade.php</code>에 위치한 템플릿을 로드합니다. 이 템플릿은 아직 정의하지 않았지만 곧 정의할 것입니다!


이제 애플리케이션에 대한 기본 레이아웃과 뷰를 정의했습니다. 우리는 이 뷰를 <code>/</code> 라우트에서 다음과 같이 반환하고 있습니다:
이제 애플리케이션에 대한 기본 레이아웃과 뷰를 정의했습니다. 우리는 이 뷰를 <code>/</code> 라우트에서 다음과 같이 반환하고 있습니다:


{{소스헤더|routes/web.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
Route::get('/', function () {
Route::get('/', function () {
329번째 줄: 248번째 줄:
==태스크 추가==
==태스크 추가==
===유효성 검증===
===유효성 검증===
이제 뷰에 폼을 만들었으니, <code>routes/web.php</code>의 <code>POST /task</code> 라우트에 코드를 추가하여 들어오는 폼 입력을 유효성 검증하고 새 태스크를 생성해야 합니다. 먼저, 입력을 검증해 봅시다.
이제 뷰에 폼을 만들었으니, <code>app/Http/routes.php</code>의 <code>POST /task</code> 라우트에 코드를 추가하여 들어오는 폼 입력을 유효성 검증하고 새로운 작업을 생성해야 합니다. 먼저, 입력을 검증해 봅시다.


이 폼의 경우, <code>name</code> 필드를 필수로 하고, <code>255</code>자 이하로 제한할 것입니다. 검증에 실패하면 사용자를 <code>/</code> URL로 리디렉션하고, 이전 입력과 오류를 [[Laravel 세션|세션]]에 플래시할 것입니다. 입력을 세션에 플래시하면 검증 오류가 있을 때에도 사용자의 입력을 유지할 수 있습니다:
이 폼의 경우, <code>name</code> 필드를 필수로 하고, <code>255</code>자 이하로 제한할 것입니다. 검사에 실패하면 사용자를 <code>/</code> URL로 리디렉션하고, 이전 입력과 오류를 [[Laravel 세션|세션]]에 플래시할 것입니다. 입력을 세션에 플래시하면 검증 오류가 있을 때에도 사용자의 입력을 유지할 수 있습니다:


{{소스헤더|routes/web.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
Route::post('/task', function () {
Route::post('/task', function (Request $request) {
     $validator = Validator::make(Request::all(), [
     $validator = Validator::make($request->all(), [
         'name' => 'required|max:255',
         'name' => 'required|max:255',
     ]);
     ]);
346번째 줄: 264번째 줄:
     }
     }
   
   
     // Create The Task...
     // 태스크 생성...
});
});
</syntaxhighlight>
</syntaxhighlight>
355번째 줄: 273번째 줄:
뷰에서 <code>@include('common.errors')</code> 지시어를 사용하여 폼의 검증 오류를 렌더링했던 것을 기억하십시오. <code>common.errors</code>는 모든 페이지에서 동일한 형식으로 검증 오류를 쉽게 보여줄 수 있게 합니다. 이제 이 뷰의 내용을 정의해 봅시다:
뷰에서 <code>@include('common.errors')</code> 지시어를 사용하여 폼의 검증 오류를 렌더링했던 것을 기억하십시오. <code>common.errors</code>는 모든 페이지에서 동일한 형식으로 검증 오류를 쉽게 보여줄 수 있게 합니다. 이제 이 뷰의 내용을 정의해 봅시다:


{{소스헤더|resources/views/common/errors.blade.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
<!-- resources/views/common/errors.blade.php -->
@if (count($errors) > 0)
@if (count($errors) > 0)
     <!-- Form Error List -->
     <!-- Form Error List -->
378번째 줄: 297번째 줄:
입력 검증이 처리되었으므로, 실제로 새 태스크를 생성하여 라우트를 계속 채워 나갑시다. 새 태스크가 생성되면 사용자를 <code>/</code> URL로 리디렉션합니다. 태스크를 생성하기 위해, 새로운 Eloquent 모델에 속성을 설정한 후 <code>save</code> 메소드를 사용할 수 있습니다:
입력 검증이 처리되었으므로, 실제로 새 태스크를 생성하여 라우트를 계속 채워 나갑시다. 새 태스크가 생성되면 사용자를 <code>/</code> URL로 리디렉션합니다. 태스크를 생성하기 위해, 새로운 Eloquent 모델에 속성을 설정한 후 <code>save</code> 메소드를 사용할 수 있습니다:


{{소스헤더|routes/web.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php' highlight='12-16'>
Route::post('/task', function (Request $request) {
Route::post('/task', function () {
     $validator = Validator::make($request->all(), [
     $validator = Validator::make(Request::all(), [
         'name' => 'required|max:255',
         'name' => 'required|max:255',
     ]);
     ]);
392번째 줄: 310번째 줄:
   
   
     $task = new Task;
     $task = new Task;
     $task->name = Request::input('name');
     $task->name = $request->name;
     $task->save();
     $task->save();
   
   
404번째 줄: 322번째 줄:
먼저, <code>/</code> 라우트를 수정하여 모든 기존 태스크를 뷰에 전달해야 합니다. <code>view</code> 함수는 배열 형태의 두 번째 인수를 받아들여 뷰에서 사용할 수 있는 데이터를 전달하며, 배열의 각 키는 뷰 내에서 변수가 됩니다:
먼저, <code>/</code> 라우트를 수정하여 모든 기존 태스크를 뷰에 전달해야 합니다. <code>view</code> 함수는 배열 형태의 두 번째 인수를 받아들여 뷰에서 사용할 수 있는 데이터를 전달하며, 배열의 각 키는 뷰 내에서 변수가 됩니다:


{{소스헤더|routes/web.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php' highlight='3,10-14'>
<?php
 
use App\Models\Task;
use Illuminate\Support\Facades\Route;
 
/**
* Show Task Dashboard
*/
Route::get('/', function () {
Route::get('/', function () {
     $tasks = Task::orderBy('created_at', 'asc')->get();
     $tasks = Task::orderBy('created_at', 'asc')->get();
425번째 줄: 334번째 줄:
데이터가 전달되면, <code>tasks.blade.php</code> 뷰에서 태스크를 순회하여 테이블에 태스크를 표시할 수 있습니다. <code>@foreach</code> Blade 구조는 간결한 루프를 작성할 수 있게 해주며, 이는 빠른 순수 PHP 코드로 컴파일됩니다:
데이터가 전달되면, <code>tasks.blade.php</code> 뷰에서 태스크를 순회하여 테이블에 태스크를 표시할 수 있습니다. <code>@foreach</code> Blade 구조는 간결한 루프를 작성할 수 있게 해주며, 이는 빠른 순수 PHP 코드로 컴파일됩니다:


{{소스헤더|resources/views/tasks.blade.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
@extends('layouts.app')
@extends('layouts.app')
 
@section('content')
@section('content')
     <!-- Create Task Form... -->
     <!-- Create Task Form... -->
 
     <!-- Current Tasks -->
     <!-- Current Tasks -->
     @if (count($tasks) > 0)
     @if (count($tasks) > 0)
         <div class="card m-3">
         <div class="panel panel-default">
             <div class="card-header">
             <div class="panel-heading">
                 Current Tasks
                 Current Tasks
             </div>
             </div>
 
             <div class="card-body">
             <div class="panel-body">
                 <table class="table table-striped">
                 <table class="table table-striped task-table">
 
                     <!-- Table Headings -->
                     <!-- Table Headings -->
                     <thead>
                     <thead>
447번째 줄: 355번째 줄:
                         <th>&nbsp;</th>
                         <th>&nbsp;</th>
                     </thead>
                     </thead>
 
                     <!-- Table Body -->
                     <!-- Table Body -->
                     <tbody>
                     <tbody>
456번째 줄: 364번째 줄:
                                     <div>{{ $task->name }}</div>
                                     <div>{{ $task->name }}</div>
                                 </td>
                                 </td>
 
                                 <td>
                                 <td>
                                     <!-- TODO: Delete Button -->
                                     <!-- TODO: Delete Button -->
476번째 줄: 384번째 줄:
삭제 버튼을 추가해야 할 곳에 "TODO" 메모를 남겼습니다. 이제 <code>tasks.blade.php</code> 뷰의 태스크 목록 각 행에 삭제 버튼을 추가하겠습니다. 각 태스크에 대해 단일 버튼 폼을 생성할 것입니다. 버튼을 클릭하면 애플리케이션에 <code>DELETE /task</code> 요청이 전송됩니다.
삭제 버튼을 추가해야 할 곳에 "TODO" 메모를 남겼습니다. 이제 <code>tasks.blade.php</code> 뷰의 태스크 목록 각 행에 삭제 버튼을 추가하겠습니다. 각 태스크에 대해 단일 버튼 폼을 생성할 것입니다. 버튼을 클릭하면 애플리케이션에 <code>DELETE /task</code> 요청이 전송됩니다.


{{소스헤더|resources/views/tasks.blade.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php' highlight='7-17'>
<tr>
                            <tr>
    <!-- 태스크 이름 -->
                                <!-- Task Name -->
    <td class="table-text">
                                <td>
        <div>{{ $task->name }}</div>
                                    {{ $task->name }}
    </td>
                                </td>
 
    <!-- 삭제 버튼 -->
                                <!-- Delete Button -->
    <td>
                                <td>
        <form action="{{ url('task/'.$task->id) }}" method="POST">
                                    <form action="{{ url('task/'.$task->id) }}" method="POST">
            {{ csrf_field() }}
                                        {{ csrf_field() }}
            {{ method_field('DELETE') }}
                                        {{ method_field('DELETE') }}
   
   
                                        <button type="submit" class="btn btn-danger">
            <button type="submit" class="btn btn-danger">
                                            Delete
                <i class="fa fa-trash"></i> Delete
                                        </button>
            </button>
                                    </form>
        </form>
                                </td>
    </td>
                            </tr>
</tr>
</syntaxhighlight>
</syntaxhighlight>


;메소드 스푸핑에 대한 참고사항
;메소드 스푸핑에 대한 참고
HTML 폼은 <code>GET</code>과 <code>POST</code> HTTP 메소드만 허용하기 때문에, 폼 메소드가 <code>POST</code>로 나열되어 있지만, <code>DELETE</code> 요청을 처리하려면 <code>Route::delete</code> 라우트를 사용합니다. 폼에서 <code>DELETE</code> 요청을 스푸핑할 방법이 필요합니다.
HTML 폼은 <code>GET</code>과 <code>POST</code> HTTP 메소드만 허용하기 때문에, 폼 메소드가 <code>POST</code>로 나열되어 있지만, <code>DELETE</code> 요청을 처리하려면 <code>Route::delete</code> 라우트를 사용합니다. 폼에서 <code>DELETE</code> 요청을 스푸핑하는 방법이 필요합니다.


에서 <code>method_field('DELETE')</code> 함수를 사용하여 <code>DELETE</code> 요청을 스푸핑할 수 있습니다. 이 함수는 Laravel이 인식하고 실제 HTTP 요청 메소드를 덮어쓸 숨겨진 폼 입력을 생성합니다. 생성되는 필드는 다음과 같습니다:
내에 <code>method_field('DELETE')</code> 함수를 사용하여 <code>DELETE</code> 요청을 스푸핑할 수 있습니다. 이 함수는 Laravel이 인식하고 실제 HTTP 요청 메소드를 덮어쓸 숨겨진 폼 입력을 생성합니다. 생성되는 필드는 다음과 같습니다:


<syntaxhighlight lang='html'>
<syntaxhighlight lang='html'>
512번째 줄: 419번째 줄:
라우트 콜백에서는, <code>delete</code> 메소드를 사용하여 레코드를 삭제합니다. 레코드가 삭제되면 사용자를 <code>/</code> URL로 리디렉션합니다:
라우트 콜백에서는, <code>delete</code> 메소드를 사용하여 레코드를 삭제합니다. 레코드가 삭제되면 사용자를 <code>/</code> URL로 리디렉션합니다:


{{소스헤더|routes/web.php}}
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
Route::delete('/task/{task}', function (Task $task) {
Route::delete('/task/{task}', function (Task $task) {

제타위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 제타위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 편집 도움말 (새 창에서 열림)

이 문서에서 사용한 틀: