Laravel 프레임 워크를 사용하여 응용 프로그램을 개발할 때 종종 의존성 주입을 위해 강력한 서비스 컨테이너에 의존합니다. Laravel의 종속성 주입 기능은 코드의 테스트 가능성을 향상시킬뿐만 아니라 유지 관리 가능성을 크게 향상시킵니다. 그러나 일부 시나리오에서는 종속성을 구문 분석 할 때 객체 유형을 판단해야 할 수도 있습니다. 현재 IS_A () 함수는 매우 유용합니다.
PHP의 내장 함수 IS_A () 는 객체가 지정된 클래스의 인스턴스인지 또는 클래스의 서브 클래스인지를 결정하는 데 사용됩니다.
is_a(object|string $object_or_class, string $class, bool $allow_string = false): bool
매개 변수 설명 :
$ object_or_class : 확인할 객체 또는 클래스 이름입니다.
$ 클래스 : 대상 클래스 이름.
$ allow_string : 클래스 이름 문자열을 허용할지 여부 (기본값 false ).
때로는 다른 인터페이스 또는 상위 클래스를 기반으로 여러 구현 클래스를 등록해야합니다. 예를 들어, 여러 결제 게이트웨이 서비스가있을 수 있으며, 모두 동일한 인터페이스를 구현합니다. 현재 IS_A ()를 사용하여 서비스를 컨테이너에 바인딩 할 때 유형을 결정하면 사용할 서비스를보다 유연하게 제어 할 수 있습니다.
결제 게이트웨이의 예를 보여 드리겠습니다.
먼저 인터페이스 지불 GateWayInterface를 정의합니다.
namespace App\Contracts;
interface PaymentGatewayInterface
{
public function charge(float $amount);
}
다음으로 두 개의 구현 클래스를 정의하십시오.
namespace App\Services;
use App\Contracts\PaymentGatewayInterface;
class StripeGateway implements PaymentGatewayInterface
{
public function charge(float $amount)
{
// Stripe 논리
}
}
class PaypalGateway implements PaymentGatewayInterface
{
public function charge(float $amount)
{
// Paypal 논리
}
}
서비스 제공 업체에서는 클래스가 특정 유형에 속하는지에 따라 동적으로 바인딩 할 수 있습니다.
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Contracts\PaymentGatewayInterface;
use App\Services\StripeGateway;
use App\Services\PaypalGateway;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(PaymentGatewayInterface::class, function ($app) {
$gateway = config('services.payment_gateway'); // 이 구성 항목이 클래스 이름 문자열이라고 가정하십시오
if (is_a($gateway, PaymentGatewayInterface::class, true)) {
return new $gateway();
}
throw new \InvalidArgumentException("잘못된 결제 게이트웨이 유형:{$gateway}");
});
}
}
구성 파일 config/services.php 가 다음과 같이 정의된다고 가정 해 봅시다.
return [
'payment_gateway' => \App\Services\StripeGateway::class,
];
이를 통해 구성에 따라 다양한 구현 클래스를 동적으로 반환 할 수 있으며 IS_A () 를 통해 반환 된 클래스가 예상 유형과 일치하도록하여 잘못된 구성으로 인한 런타임 오류를 피합니다.
컨트롤러 또는 서비스 클래스에서는 유형 프롬프트 인터페이스 만 필요합니다.
use App\Contracts\PaymentGatewayInterface;
class OrderController extends Controller
{
public function pay(PaymentGatewayInterface $gateway)
{
$gateway->charge(100);
}
}
Laravel은 구성에 정의 된 구현 클래스를 자동으로 주입하며 IS_A () 를 통해 유형 안전을 보장합니다.
IS_A () 는 간단하지만 매우 실용적인 도구 기능입니다. Laravel의 서비스 컨테이너에 사용하면 유형 판단 논리의 보안 및 유연성을 향상시킬 수 있습니다. 특히 구성 또는 런타임 조건에 따라 바인딩 서비스 인스턴스를 결정 해야하는 경우 IS_A ()는 유형 유효성 검사를 수행하는 우아한 방법을 제공합니다.
이러한 방식으로 컨테이너가 주입 한 서비스가 예상 인터페이스 계약을 충족시켜 런타임 오류를 줄이고 응용 프로그램 안정성을 향상시킬 수 있습니다.