평범한 이야기들

[TIL] PHP Laravel - Request 객체 본문

평범한 개발 이야기/Laravel

[TIL] PHP Laravel - Request 객체

songsariya 2021. 2. 24. 18:20
728x90

Request 객체를 사용한 데이터 조회

Illuminate\Http\Request 인스턴스를 사용해 값을 조회

Route::post('form', function( Illuminate\Http\Request $request) {
    $request->all(); // 전체 데이터 가져오기.
});
// 모든 값을 배열로 가짐
$request->all();

// 배열에서 제외할 값을 지정
$request->except('_token'); //_token 값을 제외하고 전부 가져온다.

// 배열에서 가져올 값을 지정
$request->only(['firstname','utm']); //firstname, utm 값만 가져온다.

// 특정 키에 대한 값이 존재하는지 확인
if($request->has('utm')) {
    // 해당 값이 있을때 처리 할 로직
}

// 특정 키에 대한 값을 가져옴 두번째 인자는 기본값
$request->input('name', 'Unknown');

// HTTP 메서드를 확인 또는 검증
$method = $request->method();

if($request->isMethod('post')){
    // HTTP POST 요청일 때 처리 할 로직
}

// 배열 입력 점으로 처리
<input type="text" name="employees[0][firstname]">
<input type="text" name="employees[0][lastname]">
<input type="text" name="employees[1][firstname]">
<input type="text" name="employees[1][lastname]">

$request->input('employees.0.firstname');
$request->input('employees.*.lastname'); // 배열로 반환
$request->input('employees.1'); // 배열로 반환 ['firstName' => '값', 'lastname'=>'값']

// json 형태의 값도 input을 이용해 가능

 

라우트 데이터

url에서 데이터를 조회하는 방법은 Request 객체에서 데이터 조회하는 방법, 라우트 파라미터로 얻는 방법

URL 세그먼트 조회하는 방법

//http://www.myapp.com/users/15 주소일때
$request->segment(); // 배열로 리턴 해준다. users, 15
$request->segment(1); // users 값 리턴

라우트 파라미터를 활용

Route::get('users/{id}', function ($id) {
    // {id} 가 $id에 맵핑되어 사용할 수 있다.
});

 

파일 업로드

$request->file('파일폼이름');

// 파일 업로드 확인
$request->hasFile('파일폼이름');

// isValid() 메소드를 이용해 파일이 성공적으로 업로드 되었는지 확인 (해당 메서드는 파일 인스턴스에서만 호출되므로 파일 업로드 확인 후 처리
if($request->hasFile('파일폼이름') &&
    $request->file('파일폼이름')->isValid()) {
    // 처리
}

// 폴더명, 디스크 이름 -> 이름을 지정못함
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');

// 폴더명, 저장될 파일명,  디스크 이름 으로 저장.
$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');

심포니의 UploadedFile 클래스는 SplFileInfo 클래스를 확장하여 파일을 손쉽게 확인하고 조작할 수 있는 메서드 제공 (리스트는 제외)

 

유효성 검사

  • Request 객체의 validate() 메서드 사용
  • 수동으로 검사

 

validate() 메서드 사용

// 간단하게 검증을 할 수 있다.
$request->validate([
    'title' => 'required|unique:recipes|max:125',
    'body' => 'required',
]);

입력 값이 유효하지 못하면 ValidationException 예외 발생

규칙의 종류는 많이 있기 때문에 문서 참조 [ Validate 규칙 종류 ]

 

수동으로 검증

Validator 퍼사드를 사용해 Validator 객체의 인스턴스를 생성한 뒤에 검증

$validator = Validator::make($request->all(), [
    'title' => 'required|unique:recipes|max:125',
    'body' => 'required',
    ]);

if($validator->fails()){
    // 오류에 대한 처리
    return redirect('recipes/create')->withErrors($validator)->withInput(); //withErrors 메서드를 체이닝 해 메시지 전달
}

 

커스텀 Rule 객체

직접 Rule 객체를 만들 때에는 우선 Rule 객체를 상속받는 고유한 클래스를 정의해야 함

클래스에는 passes(), message() 메서드 둘을 구현해야 함

// 이메일이 화이트리스트에 해당하는 tighten.co 이메일인지 확인
class WhitelistedEmailDomain Implements Rule
{
    // 첫번째 파라미터 : 검증하려는 필드의 이름
  // 두번째 파라미터 : 사용자가 입력한 값
    public function passes($attribute, $value) 
    {
        // boolean 값으로 리턴
        return in_array(Str::after($value,"@"), ['tighten.co']);
    }

    public function message()
    {
        // 필드의 이름을 대체하기 위해 :attribute 사용
        return 'The :attribute field is not from a whitelisted email provider.';
    }
}

// 룰 사용방법
$request->validate([
    'email' => new WhitelistedEmailDomain ,
]);

 

검증 오류 메시지 표시

Request 객체의 validate() 메서드는 유효성 검증 오류 메시지를 세션에 기록함

에러 리다이렉트 뷰에서 $errors 변수로 접근 가능

// 전체 출력
@if ($errors->any())
    <ul id="errors">
        @foreach ($errors->all() as $error) 
            <li>{{ $error }} </li>
        @endforeach
    </ul>
@endif

// 주어진 필드에서만 오류 메시지가 있는지 확인 후 출력
// < 5.8
@if ($errors->has('first_name'))
    <span> {{ $erros->first('first_name') }} </span>
@endif

// > 5.8
@error('first_name')
    <span>{{ $message }}</span>
@enderror

 

폼 요청 객체

폼 요청 객체는 일종의 커스텀한 요청 객체이며 사용자의 입력을 확인, 사용자의 인증 및 권한을 확인하여 필요한 경우 다른 페이지로 리다이렉트

사용자의 액션에 대해서 이 폼 객체를 명시적으로 적용할 수 있음

// 폼 요청 객체 생성
~ php artisan make:request CreateCommentRequest

app\Http\Requests 디렉터리에 CreateCommentReqeust.php 파일이 만들어짐

authorize(), rules() 2개의 메서드 가짐

authorize() : 사용자가 해당 요청을 수행할 권한이 있는지 확인 여부 후 boolean 값 반환

rules() : 사용자 입력값의 유효성을 검증하는 규칙을 정의한 배열 반환

// 사용법

Route::post('comment', function (App\Http\Requests\CreateCommentRequest $request){
    // 로직 
});

라라벨이 알아서 해당 클래스의 메서드를 호출 유효성 검증, 권한 검증

 

엘로퀀트 모델의 대량 할당

사용자 입력 데이터가 엘로퀀트 모델과 바로 연결되는 경우

(이런 코드는 권장하지 않는다)

Route::post('posts', function (Request $request) {
    $newPost = Post::create($request->all());
});

이렇게 하면 특정 값을 변경할 수 있고 문제가 많이 있음.

$fillable 또는 $guarded를 정의해서 안전하게 입력받을 수 있게 작업해야 함

$request→only()를 사용해 더욱 안전하게 할 수 있음

728x90
Comments