Lors du développement d'applications à l'aide du cadre Laravel, nous comptons souvent sur ses puissants conteneurs de service pour l'injection de dépendance. La fonction d'injection de dépendance de Laravel améliore non seulement la testabilité du code, mais améliore également considérablement la maintenabilité. Cependant, dans certains scénarios, nous devrons peut-être juger le type d'objet lors de l'analyse des dépendances. Pour le moment, la fonction is_a () est très utile.
La fonction intégrée IS_A () de PHP est utilisée pour déterminer si un objet est une instance de la classe spécifiée ou une sous-classe de la classe.
is_a(object|string $object_or_class, string $class, bool $allow_string = false): bool
Description du paramètre:
$ object_or_class : le nom de l'objet ou de la classe à vérifier.
$ Classe : Nom de la classe cible.
$ allow_string : s'il faut autoriser la chaîne de nom de classe (par défaut false ).
Parfois, nous devons enregistrer plusieurs classes d'implémentation en fonction de différentes interfaces ou classes parents. Par exemple, vous pouvez avoir plusieurs services de passerelle de paiement, qui implémentent tous la même interface. À l'heure actuelle, l'utilisation de IS_A () pour déterminer le type lors de la liaison du service au conteneur vous permet de contrôler plus flexible le service à utiliser.
Illustrons avec un exemple de passerelle de paiement.
Définissez d'abord une interface PaytgatewayInterface :
namespace App\Contracts;
interface PaymentGatewayInterface
{
public function charge(float $amount);
}
Ensuite, définissez deux classes d'implémentation:
namespace App\Services;
use App\Contracts\PaymentGatewayInterface;
class StripeGateway implements PaymentGatewayInterface
{
public function charge(float $amount)
{
// Stripe logique
}
}
class PaypalGateway implements PaymentGatewayInterface
{
public function charge(float $amount)
{
// Paypal logique
}
}
Dans un fournisseur de services, nous pouvons nous lier dynamiquement en fonction de la question de savoir si la classe appartient à un certain type:
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'); // Supposons que cet élément de configuration est une chaîne de nom de classe
if (is_a($gateway, PaymentGatewayInterface::class, true)) {
return new $gateway();
}
throw new \InvalidArgumentException("Type de passerelle de paiement non valide:{$gateway}");
});
}
}
Supposons que le fichier de configuration config / services.php est défini comme suit:
return [
'payment_gateway' => \App\Services\StripeGateway::class,
];
Cela permet à différentes classes d'implémentation d'être renvoyées dynamiquement en fonction de la configuration, et via IS_A () , il est assuré que la classe retournée est conforme au type attendu, en évitant les erreurs d'exécution causées par une configuration incorrecte.
Dans le contrôleur ou la classe de service, seule l'interface d'invite de type est requise:
use App\Contracts\PaymentGatewayInterface;
class OrderController extends Controller
{
public function pay(PaymentGatewayInterface $gateway)
{
$gateway->charge(100);
}
}
Laravel injectera automatiquement les classes d'implémentation définies dans la configuration, et nous avons assuré la sécurité de type via IS_A () .
IS_A () est une fonction d'outil simple mais très pratique. L'utiliser dans le conteneur de service de Laravel peut améliorer la sécurité et la flexibilité de la logique de jugement de type. Surtout lorsqu'il est nécessaire de décider des instances de service de liaison basées sur la configuration ou les conditions d'exécution, IS_A () fournit un moyen élégant d'effectuer la validation de type.
De cette façon, il est possible de s'assurer que les services injectés par le conteneur respectent le contrat d'interface attendu, réduisant ainsi les erreurs d'exécution et améliorant la stabilité des applications.