먼저 생성 화면을 보여주는 create() 메소드를 구현해 보겠습니다.

public function create($projId)
{
    $proj = Project::findOrFail($projId);

    return view('project.task.create')
        ->with('proj', $proj);
}
CODE

이제  resources/views/project/task/create.blade.php 파일에 다음 내용을 작성합니다.

resources/views/project/task/create.blade.php

@extends('layouts.app')

@section('title')
    태스크 생성
@endsection

@section('content')

    <div class="col-md-12">
        <form class="form-horizontal" role="form" method="POST" action="{{ route('project.task.store', [$proj->id]) }}">	// 1
            {{ csrf_field() }}

            <div class="form-group">
                <label for="project.task.name">태스크 명</label>
                <div>
                    <input type="text" class="form-control" name="name" value="{{ old('name') }}">
                </div>
            </div>

            <div class="form-group">
                <label for="설명">설명</label>
                <div>
                    <textarea class="form-control" rows="3" name="description">{{ old('description') }}</textarea>
                </div>
            </div>
            <div class="form-group">
                <label>우선순위</label>
                <div>
                    <select class="form-control" name="priority">	//2
                        @foreach(['낮음' ,'보통', '높음'] as $p)
    						<option value="{{$p}}" {{ (old('priority') === $p) ? "selected" : "" }}>{{$p}}</option>
						@endforeach
                    </select>
                </div>
            </div>
            <div class="form-group">
                <label>상태</label>
                <div>
                    <select class="form-control" name="status">	//3
                        @foreach(['등록', '진행', '완료'] as $s)
						    <option value="{{$s}}" {{ (old('status') === $s) ? "selected" : "" }}>{{$s}}</option>
						@endforeach
                    </select>
                </div>
            </div>
            <div class="form-group">
                <label for="기한">기한</label>
                 <div class='input-group date' id='due_date'>
                     <input type='text' class="form-control" value=""/>
                    <span class="input-group-addon">
                        <span class="glyphicon glyphicon-calendar"></span>
                    </span>
                </div>
                <script type="text/javascript">
                    $(function () {
                        $('#due_date').datetimepicker({		//4
                            locale: 'en',
							defaultDate: '{{ \Carbon\Carbon::now() }}',
							format: 'YYYY-MM-DD HH:mm:ss'
                        });
                    });
                </script>
            </div>
            <div class="form-group">
                <div>
                    <button type="submit" class="btn btn-primary">
                        생성
                    </button>
                </div>
            </div>
        </form>
    </div>
@endsection
PHP
  • 1 : 폼을 처리할 URL 을 project.task.store 라우팅으로 지정합니다.
  • 2 : 태스크의 우선 순위를 지정하는 select 박스를 생성하며 예전 폼 데이타가 있는지 old('priority') 로 확인 후에 있을 경우 "selected" 속성을 부여합니다.
  • 3 : 태스크의 상태를 지정하는 select 박스를 생성하며 2번 처럼 예전 폼 데이타를 확인합니다.
  • 4 : 달력 콘트롤의 시간을 현재로 맞추고 날자 포맷을 설정합니다. 

 

이제 POST 로 전달한 태스크 등록 데이타를 처리할 store() 메소드를 구현합니다.

public function store(Request $request, $projId)
{
    $task = new Task([	//1
        'name' => $request->get('name'),
        'description' => $request->get('description'),
        'priority' => $request->get('priority'),
        'status' => $request->get('status'),
        'due_date' => $request->get('due_date'),
    ]);

    $task->project()->associate($projId);;	//2

    $task->save();	//3

    return redirect(route('project.task.index', $task->project->id))
        ->with('message', $task->name . ' 가 생성 되었습니다.');
}
CODE
  • 1: 폼으로 전달된 내용을 기반으로 Task 객체를 생성합니다.
  • 2: 태스크를 현재 프로젝트와 연결 합니다.
  • 3: 태스크를 DB 에 저장합니다.

구현이 완료되었고 브라우저로 연결하여 정상적으로 태스크가 등록되는지 여부를 확인해 봅시다.

태스크 삭제 기능은 더 간단하므로 프로젝트 컨트롤러의 destroy() 메소드를 참고하여 독자들이 직접 구현해 보기 바랍니다.