과제 요구사항
- 엑셀비드 db 연결
- 엑셀비드 플랫폼 tools 안에 child 로 새로운 메뉴 하나 만들기
- member 테이블에서 내 이름, id 찾아오고 그걸 출력할 수 있도록.
- 테이블 하나 create. join 을 써서 데이터 가져올 수 있도록.
- 이름, idx, 날짜, 요일, 점심, 저녁 메뉴 출력.
- 가능하면 update 까지
현재 진행 상황
CRU 까지 완성 (Delete는 db 삭제 권한이 없어서 애초에 못함. del_flag로 구현할 수 있긴한데, db 테이블 속성 수정 권한도 없어서...ㅜㅜ 일단 이번 과제는 여기까지 하기로 했음)
READ
1. 사이드바 메뉴에 meal 추가
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/resources/views/includes/sidebar-admin.blade.php
<li class="nav-item">
<a href="/{{ $prefix['tool'] }}/meal" class="dropdown-item {{ (request()->is($prefix['tool']."/meal*")) ? 'active' : '' }}">
<span>Meal</span>
</a>
</li>
2. tool/meal 로 라우팅
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/routes/web-admin.php
Route::get('meal', 'ToolController@meal')->name('meal');
3. tool/meal 로 라우팅 됐을 때의 작업을 처리해줄 ToolController 에 MealRepository 모델 연결 및 meal 함수 생성
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/app/Http/Controllers/Admin/ToolController.php
# use MealRepository 추가
use App\Repositories\MealRepository;
# construct에 MealRepository 추가
public function __construct(
AppRepository $appRepository,
MenuRepository $menuRepository,
MongoSearchRepository $mongoSearchRepository,
MemberRepository $memberRepository,
MealRepository $mealRepository
)
# this 객체에 meal 추가
$this->meal = $mealRepository;
public function meal()
{
$meals = $this->meal->findAllMeals("강경림");
return view('admin.tool.meal', compact(['meals']));
}
4. mealRepository에 db에서 meal 정보를 가져오는 findAllMeals 함수 생성
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/app/Repositories/MealRepository.php
public function findAllMeals($name)
{
$sql = " SELECT member.mb_idx, tmp_menu.name, tmp_menu.date, tmp_menu.lunch, tmp_menu.dinner FROM tmp_menu LEFT JOIN member ON tmp_menu.name = member.name WHERE tmp_menu.name = :name ";
$bind = [ 'name'=>$name ];
return $this->db->select($sql, $bind);
}
5. view 파일 생성
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/resources/views/admin/tool/meal.blade.php
@extends('layouts.app')
@section('content')
@pagetitle(['title'=> 'Meal', 'pretitle'=> 'Tool'])
<div class="col-auto ml-auto d-print-none">
<a href="{{ route('admin.tool.create') }}" class="btn btn-primary ml-3">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg>
Create New Meal
</a>
</div>
@endpagetitle
<form action="" method="post" class="card">
<table id="meal-table" class="table card-table table-vcenter table-nowrap table-hover table-action">
<thead>
<tr>
<th class="w-px pr-5">idx</th>
<th class="w-px pr-5">이름</th>
<th class="w-px pr-5">일자</th>
<th class="w-px pr-5">요일</th>
<th class="w-px pr-5">점심 매뉴</th>
<th class="w-px pr-5">저녁 메뉴</th>
</tr>
</thead>
<tbody>
@forelse ($meals as $meal)
<?php
$date = substr($meal->date, 0, 10);
$weekday = array("일","월","화","수","목","금","토");
$week = $weekday[date('w', strtotime($date))]."요일";
?>
<tr>
<td>{{$meal->mb_idx}}</td>
<td>{{$meal->name}}</td>
<td>
{{$date}}
</td>
<td>
{{$week}}
</td>
<td>
{{$meal->lunch}}
<a href="{{ route('admin.tool.edit', $meal->date ) }}" class="text-muted btn-action">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg>
</a>
</td>
<td>{{$meal->dinner}}</td>
</tr>
@empty
<tr>
<td colspan="10" class="text-center p-5">조회 결과가 없습니다.</td>
</tr>
@endforelse
</tbody>
</table>
</form>
@endsection
CREATE
1. meal view 파일에 create 버튼 추가
위의 view 파일에서 pagetitle 영역에 create new meal 버튼 부분 이미 추가되어있음.
<a href="{{ route('admin.tool.create') }}" class="btn btn-primary ml-3">
2. 클릭하면 admin.tool.create로 가는 라우팅 설정
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/routes/web-admin.php
Route::get('create', 'ToolController@create')->name('create');
3. create 뷰 파일
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/resources/views/admin/tool/create.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
@pagetitle(['title'=>'Publisher', 'pretitle'=> 'Partner'])
@endpagetitle
<form id="frm-publisher" method="post" action="{{ route('admin.tool.store') }}" enctype="multipart/form-data">
@csrf
@method('POST')
<div class="card">
<div class="card-header">
<h4 class="card-title">meal 정보</h4>
</div>
<div class="card-body">
<div class="form-group row">
<label class="col-sm-2 col-form-label">이름</label>
<div class="col-sm-10 was-error">
<input type="text" name="name" class="form-control" placeholder="" required>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">날짜</label>
<div class="col-sm-10 was-error">
<input type="text" name="date" class="form-control" placeholder="" required>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">점심 메뉴</label>
<div class="col-sm-10 was-error">
<input type="text" name="lunch" class="form-control" placeholder="" required>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">저녁 메뉴</label>
<div class="col-sm-10 was-error">
<input type="text" name="dinner" class="form-control" placeholder="" required>
</div>
</div>
<div class="card">
<div class="card-footer">
<button id="submit" type="submit" class="btn btn-primary ml-auto">Submit</button>
<a href="{{ route('admin.partner.publisher.index', request()->input()) }}" class="btn btn-link">Cancel</a>
</div>
</div>
</form>
</div>
@endsection
4. ToolController 에 해당 뷰를 보여줄 create 함수 생성
public function create()
{
return view('admin.tool.create');
}
5. (여기서부터 post 부분 작업 시작) submit 버튼 눌렀을 때 admin.tool.store로 가는 라우팅 설정
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/routes/web-admin.php
Route::post('store', 'ToolController@store')->name('store');
6. ToolController에 post 요청을 처리해줄 store 함수 생성
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/app/Http/Controllers/Admin/ToolController.php
public function store(Request $request)
{
$newMeal = $this->meal->createNewMeal($request);
return redirect()->route('admin.tool.meal');
}
7. db 에 payload data를 insert 해줄 createNewMeal 함수 생성
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/app/Repositories/MealRepository.php
public function createNewMeal($request)
{
$sql = " INSERT into tmp_menu VALUES (:date, :name, :lunch, :dinner) ";
$bind = [ 'date'=> $request->date, 'name'=>$request->name, 'lunch'=>$request->lunch, 'dinner'=>$request->dinner ];
return $this->db->insert($sql, $bind);
}
UPDATE
1. meal view 파일에 update 버튼 추가 (이미 추가되어 있어서 생략)
2. 해당 버튼을 클릭하면 admin/tool/edit/{date} 로 url 파라미터에 primary key 인 date를 담아서 이동하도록 라우팅
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/routes/web-admin.php
Route::get('edit/{date}', 'ToolController@edit')->name('edit');
3. ToolController에 edit 함수 추가
public function edit($date)
{
$meal = $this->meal->findOneMeal($date);
return view('admin.tool.edit', compact('meal'));
}
4. edit 대상인 데이터의 key 값(여기서는 date가 key 값) 으로 해당 데이터 가져오는 findOneMeal 함수 추가 (모델)
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/app/Repositories/MealRepository.php
public function findOneMeal($date)
{
$date = substr($date, 0, 10);
$sql = " SELECT member.mb_idx, tmp_menu.name, tmp_menu.date, tmp_menu.lunch, tmp_menu.dinner FROM tmp_menu LEFT JOIN member ON tmp_menu.name = member.name WHERE tmp_menu.date = :date ";
$bind = [ 'date'=>$date ];
return $this->db->select($sql, $bind);
}
5. edit 뷰 파일 생성
@extends('layouts.app')
@section('content')
<div class="container">
@pagetitle(['title'=>'Meal', 'pretitle'=> 'tool'])
@endpagetitle
<form id="frm-publisher" method="patch" action="{{ route('admin.tool.update') }}" enctype="multipart/form-data">
@csrf
@method('PATCH')
<div class="card">
<div class="card-header">
<h4 class="card-title">meal 정보 수정</h4>
<?php
$mealInfo = $meal[0];
$mealInfo -> date = substr($mealInfo->date, 0, 10);
?>
</div>
<div class="card-body">
<div class="form-group row">
<label class="col-sm-2 col-form-label">이름</label>
<div class="col-sm-10 was-error">
<input type="text" name="name" value="{{ $mealInfo->name }}" class="form-control" placeholder="" readonly required>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">날짜</label>
<div class="col-sm-10 was-error">
<input type="text" name="date" value="{{ $mealInfo->date }}" class="form-control" placeholder="" readonly required>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">점심 메뉴</label>
<div class="col-sm-10 was-error">
<input type="text" name="lunch" value="{{ $mealInfo->lunch }}" class="form-control" placeholder="" required>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">저녁 메뉴</label>
<div class="col-sm-10 was-error">
<input type="text" name="dinner" value="{{ $mealInfo->dinner }}" class="form-control" placeholder="" required>
</div>
</div>
<div class="card">
<div class="card-footer">
<button id="submit" type="submit" class="btn btn-primary ml-auto">Submit</button>
<a href="{{ route('admin.tool.meal', request()->input()) }}" class="btn btn-link">Cancel</a>
</div>
</div>
</form>
</div>
@endsection
- input: 수정하면 안 되는 영역에는 readonly 속성 주기 + 원래 데이터로 value 채우기
- form submit 하면 patch method로 admin.tool.update로 라우팅
6. admin.tool.update 라우팅 설정해주기
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/routes/web-admin.php
Route::match(['get', 'patch'], 'update', 'ToolController@update')->name('update');
7. ToolController에 patch 요청을 처리해주는 update 함수 추가
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/app/Http/Controllers/Admin/ToolController.php
public function update(Request $request)
{
$this->meal->updateMeal($request);
return redirect()->route('admin.tool.meal');
}
8. request의 payload data를 db에 update 해줄 updateMeal 함수를 모델에 추가
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/app/Repositories/MealRepository.php
public function updateMeal($request)
{
$sql = " UPDATE tmp_menu SET lunch = :lunch, dinner = :dinner WHERE date = :date ";
$bind = [ 'date'=> $request->date, 'lunch'=>$request->lunch, 'dinner'=>$request->dinner ];
return $this->db->insert($sql, $bind);
}
Questions
1. 버튼을 누르면 admin.tool.edit으로 라우팅 된다. 근데 http://0.0.0.0:802/admin/tool/edit?2022-01-03%2000:00:00 이런 식으로 url 파라메터로 넘어감
user는 admin.user.edit 으로 넘어가는데, http://0.0.0.0:802/admin/user/142/edit 이런식으로 '/'세그먼트로 구분된 url 로 넘어감.
근데 이 부분을 어디서 정하는 건지 모르겠음.
=> 해결됨.
/Users/kyunglimkang/Sites/dev/exelbid2-manage-v2/routes/web-admin.php
Route::get('edit/{date}', 'ToolController@edit')->name('edit');
이 부분 바꿔주니까 됐음.
위 라우팅 코드는 "해당 URI 에 접속했을 때 get을 받고, 여기서 해줄 작업은 ToolController의 edit 함수에 나와있음. 그리고 이 라우팅은 edit이라는 이름으로 대신하여 사용할 수 있다" 라는 의미인데, 나는 이러한 의미를 정확히 모르고 대충 기존 코드에 대응하는 대로 값을 바꿔보고 동작하면 넘어가는 식으로 허술하게 공부했다. 그래서 어떤 부분을 바꿔줘야할지 감이 잡히지 않았던 것. 라우팅 코드를 이해하고 나니 저절로 해결된 부분이었다.
2. 데이터 형식 맞춰주는 부분은 뷰, 모델, 컨트롤 중 어디서 해줘야할지?
ex) db 상 date에 날짜+시간까지 저장되어 있는데, 내가 쓰려고 하는건 date 의 날짜 (앞10글자). 이럴 때 10글자 자르는 부분은 어디서 하는 게 좋은지? (기능적으로는 어디서해도 다 동작함)
3. php, js, 라라벨 블레이드 문법을 다 같이 한 파일에서 써도 괜찮을지?
4. sidebar 어떻게 추가한건지 잘 모르겠음
=> 나머지 질문은 코드 리뷰 때 질문했음.
'기타' 카테고리의 다른 글
라라벨 과제 코드리뷰 후기 / 라라벨 과제 최종 리뷰 (0) | 2022.01.18 |
---|---|
라라벨 과제 2차 리뷰 (210113) (0) | 2022.01.17 |
22년 1월 2주차 TIL (0) | 2022.01.17 |
22년 1월 1주차 TIL (0) | 2022.01.10 |
oh my zsh 터미널 자동완성 (0) | 2022.01.10 |
댓글