Laravel의 "구출"도우미 기능은 놀랍습니다.

9754 단어 laravelphpwebdevoop
The rescue function은 발생한 예외를 수동으로 처리하려는 경우 필요한 기존 try/catch 블록 구문의 대안입니다. 콜백을 받아 try 블록 내에서 실행합니다. 예외가 발생하지 않으면 콜백 결과가 반환됩니다.

try/catch 블록의 일반적인 사용 사례를 살펴보겠습니다.

$country = 'USA';

try {
    $alpha2 = (new ISO3166)->alpha3($country)['alpha2'];
} catch (\Exception $e) {
    $alpha2 = null;
}




정말 아주 간단한 것에 대한 추악한 코드 조각입니다.

구조에 구조



이제 멋진 newrescue 함수를 사용하여 살펴보겠습니다.

$alpha2 = rescue(fn () => (new ISO3166)->alpha3($country)['alpha2']);


여기서 발생하는 일은 예외가 발생하지 않고 콜백이 실행될 때 콜백에서 반환되는 것이 $alpha2 변수에 할당되는 것입니다. 예외가 발생하면 $alpha2가 할당됩니다 null .

그러나 값을 지정하지 않으려면null 어떻게 해야 합니까? 글쎄, 당신은 몇 가지 옵션이 있습니다.

첫째, 다른 값을 반환할 수 있습니다. 예를 들어, 대신 false를 다시 가져올 수 있습니다. 그것이 rescue 의 두 번째 매개변수가 들어오는 곳입니다.

$isFalse = rescue(function () {
  throw new Exception;
}, false);


둘째, 두 번째 매개 변수를 콜백으로 만들 수 있습니다. 여기서 catch 블록 내에서 일반적으로 수행하는 모든 작업을 수행할 수 있으며 예외가 발생하면 해당 콜백에서 반환되는 모든 항목이 rescue에서 반환됩니다. 콜백에 대한 인수로 예외를 얻을 수도 있습니다.

rescue(function () {
  throw new Exception;
}, function ($e) {
  // do exception related stuff

  return false;
});

// => false


두 개의 콜백을 전달하는 상황에 있을 때 이 함수가 많은 유용성을 추가한다고 생각하지 않습니다. 그러나 첫 번째 콜백에서 무언가를 시도하고 실패할 경우 다른 값을 얻으려는 경우 rescue는 편리한 작은 도우미 함수입니다.

제 생각에는 rescue와 같은 함수가 프로그래밍을 재미있게 만드는 것입니다. 주의를 산만하게 하는 구문 부분을 제거하고 실제로 수행하는 작업에 초점을 맞춘 깨끗한 코드 블록을 남길 수 있습니다. 깨끗한 코드의 전형입니다. 가능하면 try/catch 블록의 끔찍함을 버릴 수 있게 해주는 간단하고 재사용 가능하며 아름답고 작은 함수입니다.

독서의 즐거움을 위해 제가 작성한 실제 라이브 코딩 샘플이 있습니다.

public function getCountryByFormat(string $country, CountryFormat $format): array|null
{
    return rescue(fn () => match ($format) {
        CountryFormat::NAME    => (new ISO3166)->name($country),
        CountryFormat::ALPHA_2 => (new ISO3166)->alpha2($country),
        CountryFormat::ALPHA_3 => (new ISO3166)->alpha3($country),
        CountryFormat::NUMERIC => (new ISO3166)->numeric($country),
    }, null, false);
}


NOTE: That third parameter of false tells the function not to report the exception to the error logger. Since we are kind of expecting this exception, we don't want to report it. Watch out for that potential gotcha.



비교를 위해 try/catch 블록에서 다음과 같이 표시됩니다.

public function getCountryByFormat(string $country, CountryFormat $format): array|null
{
    try {
        return match ($format) {
            CountryFormat::NAME    => (new ISO3166)->name($country),
            CountryFormat::ALPHA_2 => (new ISO3166)->alpha2($country),
            CountryFormat::ALPHA_3 => (new ISO3166)->alpha3($country),
            CountryFormat::NUMERIC => (new ISO3166)->numeric($country),
        };
    } catch (\Exception $e) {
        return null;
    }
}


당신이 나에게 묻는다면 꽤 달콤한 개선. 감사합니다 테일러 오트웰!

이제 rescue 에 대해 알게 되었으니 저처럼 여기저기서 사용하게 될 것입니다. 즐기다!

좋은 웹페이지 즐겨찾기