회사에서 애플 로그인 작업을 하다가 애플 서버 응답이 에러면 처리해야 하는 부분이 있었다.
PR을 날리고 코드 리뷰를 받는데 개발자분께서 optional을 쓰라고 하셨다.
-> (object operator)로 A라는 객체의 값에 접근하려고 할 때 A가 사실 객체가 아닌 경우(non object)라면 error가 나게 된다.
아래 예시에서 $exception->getResponse()->getBody()->getContent()를 통해서 특정 값에 도달 해 json_decode를 하고 error key에 접근을 시도한다.
$errorDescription = json_decode(optional(optional($exception->getResponse())->getBody())->getContents(), true)['error'] ?? null;
그런데 $exception->getResponse()->getBody()에서 $exception->getResponse()가 객체가 아니라면 객체가 아닌 곳에 ->를 사용한다고 에러가 나게 된다. 이런 일을 방지해주는 것이 optional()이다.
optional(A->B)->C을 사용하면 optional 헬퍼 안에 있는 인수가 null이 아니면 A->B->C를 사용할 수 있게 되고 인수가 null이면 null이 반환된다. optional의 이름이 왜 "선택적"인지 알 것 같다.
이로써 어디선가 받아온 객체에 ->로 접근할 때 객체가 아닌 경우 에러를 막을 수 있게 된다.
optional 헬퍼의 인수에는 closure도 위치할 수 있다. 두번째 인자에!
return optional(User::find($id), function ($user) {
return TwitterApi::findUser($user->twitter_id);
});
User::find($id)가 null이 아니면 찾아진 값을 $user에 할당해서 closure가 실행된다. closure(callback) 내에서는 TwiiterApi 테이블에서 $user의 아이디가 twitter_id인 애를 찾아 반환한다
결론 optional은 라라벨 5.5부터 사용할 수 있고 클로저와 함께 사용할 수 있는 optional은 라라벨 5.6.13에서 사용 가능, non object의 값에 접근할 때 에러 방지해 줌.
https://laravel-news.com/laravel-optional-helper
'Laravel' 카테고리의 다른 글
laravel with() vs load() (0) | 2020.02.22 |
---|---|
Laravel env() vs PHP getenv() (0) | 2020.02.21 |
PhpStorm 공식 홈페이지 단축키 모음 (0) | 2020.01.25 |
Laravel tests, RefreshDatabase (0) | 2020.01.25 |
Laravel DatabaseMigrations, DatabaseTransactions (0) | 2020.01.25 |