Contrats
- Couplage faible
- Comment utiliser les contrats
- Introduction
- Les contrats de Laravel sont un ensemble de Le framework fournit l'interface qui définit les services de base rassemblés. Par exemple, le contrat définit les méthodes requises pour envoyer des emails. Chaque contrat dispose d'une mise en œuvre prévue par le framework correspondant. Par exemple, Laravel fournit plusieurs implémentations de files d'attente de pilotes et utilise SwiftMailer pour implémenter des contrats de messagerie.
Tous les contrats Laravel sont dans leurs référentiels GitHub respectifs. Cela fournit une entrée de référence rapide pour tous les contrats disponibles et un package unique et découplé que les développeurs de packages d'extension peuvent utiliser.
IlluminateContractsQueueQueue
契约定义了队列任务所需方法,而 IlluminateContractsMailMailer
Contrats contre façades
Les façades et les fonctions d'assistance de Laravel offrent un moyen simple d'utiliser les services Laravel sans indications de type et peuvent également résoudre des contrats en dehors du conteneur de services. Dans la plupart des cas, chaque Façade dispose d’un contrat équivalent.
Contrairement aux Façades (qui ne nécessitent pas que le constructeur de votre classe référence des dépendances), les contrats vous permettent de définir des dépendances explicites pour votre classe. Certains développeurs préfèrent que les dépendances soient clairement définies et préfèrent donc recourir à des contrats, tandis que d'autres apprécient le confort apporté par les façades.
{tip} Dans la plupart des applications, que vous préfériez les façades ou les contrats, ça va. Cependant, si vous créez un package d'extension, vous devez fortement envisager d'utiliser des contrats, car ils facilitent les tests dans le contexte du package.
Quand utiliser les contrats
En résumé, l'utilisation de contrats ou de façades dépend en grande partie de vos préférences personnelles ou d'équipe. Les contrats et les façades peuvent être utilisés pour créer des applications Laravel robustes et bien testées. Tant que vous gardez les responsabilités de votre classe simples, vous constaterez que la différence réelle entre l'utilisation de contrats et de façades est très faible.
Cependant, vous vous posez peut-être encore de nombreuses questions sur le contrat. Par exemple, pourquoi utilisez-vous l’interface ? N'est-il pas plus compliqué d'utiliser l'interface ? Extrayons les raisons dans le contenu suivant (« faible couplage » et « simplicité »).
Couplage faible
Tout d'abord, examinons un code à couplage élevé pour l'implémentation du cache. Supposons que nous ayons le code suivant :
<?php namespace App\Orders; class Repository{ /** * 缓存实例. */ protected $cache; /** * 创建一个新的仓库实例. * * @param \SomePackage\Cache\Memcached $cache * @return void */ public function __construct(\SomePackage\Cache\Memcached $cache) { $this->cache = $cache; } /** * 根据 ID 获取订单. * * @param int $id * @return Order */ public function find($id) { if ($this->cache->has($id)) { // } } }
Dans cette classe, le code est fortement couplé à l'implémentation du cache donnée. Il est fortement couplé car nous nous appuyons sur une classe de cache spécifique dans un package d'extension. Si l'API de l'extension change, notre code devra également changer.
De même, si nous voulons remplacer la technologie de mise en cache sous-jacente (Memcached) par une autre technologie de mise en cache (Redis), nous devons à nouveau modifier notre base de code. Notre base de code ne devrait pas en savoir trop sur qui a fourni les données ou comment les données ont été fournies.
Nous pouvons améliorer notre code en nous appuyant sur une simple interface indépendante du package au lieu de l'implémentation précédente :
<?php namespace App\Orders; use Illuminate\Contracts\Cache\Repository as Cache; class Repository{ /** * 缓存实例. */ protected $cache; /** * 创建一个新的仓库实例. * * @param Cache $cache * @return void */ public function __construct(Cache $cache) { $this->cache = $cache; } }
Maintenant, le code n'est couplé à aucun package spécifique, même Laravel n'est pas pertinent. Étant donné que le package d'extension de contrat ne contient aucune implémentation ni dépendance, vous pouvez facilement coder une implémentation alternative pour un contrat donné, vous permettant ainsi de remplacer l'implémentation mise en cache sans modifier le code du cache.
Simple
Lorsque tous les services de Laravel sont soigneusement définis dans des interfaces simples, il est facile de déterminer la fonctionnalité fournie par un service donné. Le contrat agit comme un document concis de la fonctionnalité du cadre.
De plus, lorsque vous vous appuyez sur des interfaces simples, votre code est plus facile à comprendre et à maintenir. Au lieu de suivre les méthodes disponibles dans des classes volumineuses et complexes, vous pouvez vous référer à une interface simple et claire.
Comment utiliser un contrat
Alors, comment mettre en œuvre un contrat ? C'est en fait assez simple.
De nombreux types de classes dans Laravel sont résolus via le conteneur de services, notamment les contrôleurs, les écouteurs d'événements, les middlewares, les tâches de file d'attente et même les fermetures de routage, etc. Ensuite, pour obtenir la mise en œuvre d'un contrat, il suffit de taper l'interface "type soupçon" dans le constructeur de la classe à résoudre.
Par exemple, jetez un œil à cet écouteur d'événement :
<?php namespace App\Listeners; use App\User;use App\Events\OrderWasPlaced; use Illuminate\Contracts\Redis\Factory; class CacheOrderInformation{ /** * Redis 工厂实现。 */ protected $redis; /** * 创建一个新的事件处理器实例。 * * @param Factory $redis * @return void */ public function __construct(Factory $redis) { $this->redis = $redis; } /** * 处理事件。 * * @param OrderWasPlaced $event * @return void */ public function handle(OrderWasPlaced $event) { // } }
Lorsque l'écouteur d'événement est résolu, le conteneur de service lira l'indice de type sur le constructeur de la classe et injectera la valeur appropriée. Pour en savoir plus sur l'inscription auprès d'un conteneur de services, consultez la documentation du conteneur de services.
Référence du contrat
Ce tableau fournit une référence rapide de tous les contrats Laravel et de leurs façades équivalentes :
Façade de référencesValidator::make()
🎜🎜🎜🎜IlluminateContractsViewEngine🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsViewFactory🎜🎜🎜Voir
🎜🎜🎜🎜IlluminateContractsViewView🎜🎜View::make()
🎜🎜🎜🎜🎜本文章首发在 🎜LearnKu.com🎜 网站上。🎜🎜