일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 옵티머스 g
- 옵티머스g
- 맛집
- 라즈베리파이
- 옵지
- 20.04
- php
- 우분투 20.04
- 옵G
- C
- codeigniter
- TiL
- 프레임워크
- ubuntu
- 라라벨
- upbit
- 제주도
- 라즈비안
- 셀레니움
- 업비트
- Laravel
- Ubuntu 20.04
- 맥
- 코드이그나이터
- Raspberry Pi
- Selenium
- 우분투
- 회고
- FMS
- MySQL
- Today
- Total
평범한 이야기들
[TIL] PHP Laravel - Request 객체 본문
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()를 사용해 더욱 안전하게 할 수 있음