본문 바로가기

Laravel

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

 

Using the Laravel Optional Helper and the New Optional Closure

The Laravel `Optional` class and accompanying optional helper were introduced in Laravel 5.5. This class is useful to avoid those pesky “Trying to get property of non-object” errors in your code. Learn about the latest update to the optional helper and whe

laravel-news.com

 

'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