인덱스 구현
컨트롤러 index 메소드 구현
이제 url 별로 처리하는 메소드와 뷰를 구현할 순서입니다.
php artisan route:list --name=project 명령을 통해서 컨트롤러의 메소드와 라우팅 목록을 다시 확인하면 본 절의 이해에 도움이 됩니다.
가장 먼저 브라우저가 /project 로 요청을 보내 왔을 때 처리할 ProjectController 의 index() 메소드를 구현해 보겠습니다.
class ProjectController extends Controller
{
public function index()
{
$user = \Auth::user(); // 1
$projects = Project::where('user_id', $user->id)->get(); // 2
return view('project.index')->with('projects', $projects); // 3
}
- 1: 세션에서 현재 로그인한 사용자의 정보를 가져오기 위해 Auth::user() 메소드로 사용자의 정보를 가져 옵니다.
- 2: project 테이블에서 user_id 가 현재 로그인한 사용자의 id 와 같은 데이타를 가져옵니다.
3: DB 에서 가져온 데이타를 with() 메소드로 project.index 뷰에 전달하고 리턴합니다. with() 대신 다음과 같이 compact() 를 사용할 수도 있습니다.
return view('project.index', compact('projects'));
CODE
인덱스 뷰 구현
이제 뷰를 구현할 차례로 뷰는 기능별로 폴더를 만들고 관리하는 것이 좋으므로 프로젝트 뷰를 넣을 폴더를 먼저 생성합니다.
$ mkdir resources/views/project
이제 위의 index() 메소드에서 호출하는 뷰 페이지를 만들어 줍니다. 뷰의 이름이 project.index 이므로 뷰 파일의 경로는 resources/views/project/index.blade.php 가 됩니다.
@extends('layouts.app') //1
@section('title') //2
프로젝트 목록
@endsection
@section('content')
<div class="col-md-12">
<p>
<a href="{{ route('project.create') }}" class="btn btn-success">프로젝트 생성</a>
</p>
@if(Session::has('message')) // 3
<div class="alert alert-info">
{{Session::get('message')}}
</div>
@endif
<table class="table table-striped">
<thead>
<tr>
<td>이름</td>
<td>Description</td>
<td>생성일</td>
</tr>
</thead>
<tbody>
@foreach ($projects as $proj) // 4
<tr>
<td>
<a href="{{route('project.show', [$proj->id])}}">{{ $proj->name }}</a> //5
</td>
<td>
{{ $proj->description }}
</td>
<td>
{{ $proj->created_at }}
</td>
<td>
<a class="btn btn-success" href="{{ route('project.edit', $proj->id) }}">편집</a> // 6
</td>
<td>
<a class="btn btn-danger" href="{{ route('project.destroy', $proj->id) }}">삭제</a> //7
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endsection
- 1 : 부모 템플릿인 layouts.app 를 상속받아서 처리한다고 선언합니다.
- 2 : 부모 템플릿에서 페이지 제목을 @yield 로 선언했으므로 자식 페이지에서 제목을 지정합니다.
- 3: 프로젝트 생성이나 편집 결과를 project.index 뷰에서 표시할 예정이며 HTTP 는 상태가 없는 프로토콜이므로 다른 페이지에서 전달한 값을 받으려면 세션을 사용해야 합니다. 다른 페이지에 전달할 내용을 세션에 message 를 키로 하여 삽입하고 이를 사용하는 페이지에서는 전 절에서 설명한 세션 파사드의 has() 메소드를 사용해 세션내 message값이 있을 경우 화면에 이 내용을 알림 용도로 출력합니다.
- 4: 컨트롤러에서 전달받은 배열을 처리하기 위해 foreach 구문을 실행합니다.
5: route() 메소드를 사용하여 project.show 라우팅에 링크를 생성합니다. show 라우팅은 리소스 id 를 파라미터로 받아야 하므로 route 메소드의 두 번째 파라미터로 id 를 전달합니다. id가 1일 경우 최종 생성되는 링크는 /project/1 이 됩니다.
리소스 id 를 전달하지 않으면 최종 생성되는 URI 는 {project} 를 urlencode() 함수를 통해 나온 결과인 %7Bproject%7D 가 되므로 링크가 제대로 동작하지 않습니다.
- 6: project.edit 라우팅에 링크를 생성하며 show 마찬가지로 리소스 id 를 파라미터로 주어야 하며 id가 1일 경우 최종 생성되는 링크는 /project/1/edit 이 됩니다.
- 7: project.destroy 라우팅에 연결되며 최종 생성되는 링크는 /project/1 이 되며 show 와 구분하기 위해 HTTP 요청을 DELETE 로 보내야 합니다.
4, 5, 6은 route() 대신 url() 메소드를 사용하여 다음과 같이 구현할 수도 있습니다.
show 라우팅
<a href="{{url('/project/' . $proj->id)}}">{{ $proj->name }}</a>
edit 라우팅
<a class="btn btn-success" href="{{ url('/project/' . $proj->id .'/edit' ) }}">편집</a>
이제 기능 개발을 마쳤으니 브라우저로 연결해 보면 다음과 같이 전체 프로젝트의 목록을 출력하는 화면을 볼수 있습니다.