Laravel optional helper 라라벨

Laravel optional helper 라라벨

회사에서 애플 로그인 작업을 하다가 애플 서버 응답이 에러면 처리해야 하는 부분이 있었다.

PR을 날리고 코드 리뷰를 받는데 개발자분께서 optional을 쓰라고 하셨다.

-> (object operator)로 A라는 객체의 값에 접근하려고 할 때 A가 사실 객체가 아닌 경우(non object)라면 error가 나게 된다.

코드 리뷰 해주신 개발자분께서 보내주신 소중한 optional() 예시

아래 예시에서 $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

from http://oneshottenkill.tistory.com/619 by ccl(A) rewrite - 2020-03-31 18:59:34