111호. 폼 리퀘스트를 더 잘 활용하는 방법 free

2020-01-09

오늘 소개할 내용은 마르셀 포시오트의 라라벨 폼 리퀘스트 - 밸리데이션을 넘어(Laravel Form Requests - more than validation) 입니다.


이 글에서 포시오트는 폼 리퀘스트가 라라벨에서 가장 저평가된 기능 중 하나라고 이야기합니다. 핵심은 밸리데이션으로만 쓸 게 아니라 리퀘스트와 관련된 로직을 작성해서 활용하면 좋다는 것입니다.


폼 리퀘스트는 컨트롤러에 주입해서 사용하기 때문에 폼 리퀘스트에 리퀘스트와 관련된 로직을 추가하면 표현력이 풍부하고 아름다운 API를 만들 수 있다고 하네요.


다음은 포시오트가 비디오 코스와 제품을 판매하는 플랫폼에서 사용하는 코드라고 합니다.


namespace App\Http\Requests;

use App\Packages\CourseRepository;
use App\Packages\Package;
use Illuminate\Foundation\Http\FormRequest;

class PaddlePurchaseRequest extends FormRequest
{
public function authorize()
{
return true;
}


public function rules()
{
return [];
}

public function getPackage(): ?Package
{
return CourseRepository::findPackageForPaddleIdle($this->product_id);
}

public function isBlackFridayBundle(): bool
{
return $this->product_id == config('courses.blackfriday.bundle_id');
}

public function isVideoCourse(): bool
{
return ! is_null(CourseRepository::findPackageForPaddleIdle($this->product_id));
}

public function isTinkerwell(): bool
{
return is_null(CourseRepository::findPackageForPaddleIdle($this->product_id));
}
}

요청에 포함된 product_id 값과 관련된 로직을 수행하는 여러 메서드를 추가했습니다. 심지어 밸리데이션 기능은 사용하지도 않고 있습니다.


한 걸음 더 나아가 폼 리퀘스트를 추상화해서 여러 리퀘스트에서 공통으로 쓸 수 있는 메서드를 사용하기도 한다고 합니다. 실제로 라라벨 노바에 다음과 같은 코드가 있다고 하네요.


namespace Laravel\Nova\Http\Requests;
use Laravel\Nova\Nova;

class DashboardCardRequest extends NovaRequest
{
/**
* Get all of the possible cards for the request.
*
* @param string $dashboard
*
* @return \Illuminate\Support\Collection
*/
public function availableCards($dashboard)
{
if ($dashboard === 'main') {
return collect(Nova::$defaultDashboardCards)
->unique()
->filter
->authorize($this)
->values();
}

return Nova::availableDashboardCardsForDashboard($dashboard, $this);
}
}

DashboardCardRequestFormRequest가 아닌 NovaRequest를 상속받고 있고, 포시오트가 주장한 바와 같이 밸리데이션 이외의 메서드를 추가해서 사용하고 있습니다.


폼 리퀘스트를 밸리데이션 이외의 용도로 쓸 생각은 못했고, 컨트롤러를 가볍게 만들기 위해 로직을 서비스나 액션으로 빼는 정도만 생각을 하고 있었는데, '리퀘스트에 포함된 데이터 처리'는 폼 리퀘스트에서 처리해봐도 좋겠단 생각이 드네요.


댓글에는 폼 리퀘스트를 요청 데이터 조작 및 살균에 쓸 수도 있다는 의견도 있고, 도메인 로직이 폼 리퀘스트에 들어가면 CLI 명령에서 재활용할 수 없는 문제가 있다는 등의 의견도 있습니다.


여러분들의 생각도 궁금하네요~

xly에 댓글로 의견을 주고 받을 수 있는 기능도 서둘러 마련하도록 하겠습니다. 조금만 기다려주세요.


1일 1식 라라벨 111호

2020년 1월 9일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.