Contrats


Quand utiliser les contrats
  • Couplage faible
    • Simpleness
  • Comment utiliser les contrats
    • Référence du contrat
  • 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érences Porte Auth< /code>IlluminateContractsAuthGuardIlluminateContractsCacheLockIlluminateContractsFilesystemFilesystemIlluminateContractsQueueQueueableCollectionIlluminateContractsQueueQueueableEntityIlluminateContractsQueueShouldQueueRedisIlluminateContractsRoutingBindingRegistrar Route RouteURLIlluminateContractsRoutingUrlRoutableIlluminateContractsValidationFactory
IlluminateContractsAuthAuthenticatable
IlluminateContractsAuthCanResetPassword 
IlluminateContractsAuthFactoryGate
IlluminateContractsAuthAuthenticatable 
IlluminateContractsAuthCanResetPassword 
IlluminateContractsAuthFactoryAuth
IlluminateContractsAuthGuardAuth::guard()
IlluminateContractsAuthPasswordBrokerPassword::broker()
IlluminateContractsAuthPasswordBrokerFactoryPassword
IlluminateContractsAuthStatefulGuard 
IlluminateContractsAuthSupportsBasicAuth 
IlluminateContractsAuthUserProvider 
IlluminateContractsBusDispatcherBus
IlluminateContractsBusQueueingDispatcherBus::dispatchToQueue()
IlluminateContractsBroadcastingFactoryBroadcast
IlluminateContractsBroadcastingBroadcasterBroadcast::connection()
Auth::guard()🎜🎜🎜IlluminateContractsAuthPasswordBroker🎜🎜🎜Mot de passe ::broker()🎜🎜🎜🎜IlluminateContractsAuthPasswordBrokerFactory🎜🎜🎜Mot de passe🎜🎜🎜🎜< a href="https://github.com/illuminate/contracts/blob/5.8/Auth/StatefulGuard.php">IlluminateContractsAuthStatefulGuard🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsAuthSupportsBasicAuth🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsAuthUserProvider 🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsBusDispatcher🎜🎜🎜Bus🎜🎜🎜 🎜IlluminateContractsBusQueueingDispatcher🎜🎜🎜Bus::dispatchToQueue()🎜🎜🎜🎜 IlluminateContractsBroadcastingFactory🎜🎜🎜Diffusion🎜🎜🎜🎜IlluminateContractsBroadcastingBroadcaster🎜🎜🎜Broadcast::connection()🎜🎜🎜🎜🎜IlluminateContractsBroadcastingShouldBroadcast🎜 
IlluminateContractsBroadcastingShouldBroadcastNow 
IlluminateContractsCacheFactoryCacheCache
IlluminateContractsCacheLock 
IlluminateContractsCacheLockProvider 
IlluminateContractsCacheRepositoryCache::driver()
IlluminateContractsCacheStore 
IlluminateContractsConfigRepositoryConfig
IlluminateContractsConsoleApplication 
IlluminateContractsConsoleKernelArtisan
IlluminateContractsContainerContainerApp
IlluminateContractsCookieFactoryCookie
IlluminateContractsCookieQueueingFactoryCookie::queue()
IlluminateContractsDatabaseModelIdentifier 
IlluminateContractsDebugExceptionHandler 
IlluminateContractsEncryptionEncrypterCrypt
IlluminateContractsEventsDispatcherEvent
IlluminateContractsFilesystemCloudStorage::cloud()
 🎜🎜🎜🎜IlluminateContractsCacheLockProvider🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsCacheRepository🎜🎜🎜Cache::driver()🎜 🎜🎜🎜IlluminateContractsCacheStore🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsConfigRepository🎜🎜🎜Config🎜🎜🎜🎜IlluminateContractsConsoleApplication🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsConsoleKernel🎜🎜 🎜Artisan🎜🎜🎜🎜IlluminateContractsContainerContainer🎜🎜🎜Application< /code>🎜🎜🎜🎜IlluminateContractsCookieFactory🎜🎜🎜Cookie🎜🎜🎜 🎜IlluminateContractsCookieQueueingFactory🎜🎜🎜Cookie::queue()🎜🎜🎜🎜 IlluminateContractsDatabaseModelIdentifier🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsDebugExceptionHandler🎜🎜🎜 🎜🎜🎜🎜 IlluminateContractsEncryptionEncrypter🎜🎜🎜Crypt🎜🎜🎜🎜IlluminateContractsEventsDispatcher🎜🎜🎜Événement🎜🎜🎜🎜IlluminateContractsFilesystemCloud🎜🎜🎜Storage::cloud( )🎜🎜🎜🎜🎜IlluminateContractsFilesystemFactory🎜StockageStorage
IlluminateContractsFilesystemFilesystemStorage::disk()
IlluminateContractsFoundationApplicationApp
IlluminateContractsHashingHasherHash
IlluminateContractsHttpKernel 
IlluminateContractsMailMailQueueMail::queue()
IlluminateContractsMailMailable 
IlluminateContractsMailMailerMail
IlluminateContractsNotificationsDispatcherNotification
IlluminateContractsNotificationsFactoryNotification
IlluminateContractsPaginationLengthAwarePaginator 
IlluminateContractsPaginationPaginator 
IlluminateContractsPipelineHub 
IlluminateContractsPipelinePipeline 
IlluminateContractsQueueEntityResolver 
IlluminateContractsQueueFactoryQueue
IlluminateContractsQueueJob 
IlluminateContractsQueueMonitorQueue
Stockage ::disk()🎜🎜🎜🎜IlluminateContractsFoundationApplication🎜🎜🎜App< /code>🎜🎜🎜🎜IlluminateContractsHashingHasher🎜🎜🎜Hash🎜🎜🎜 🎜IlluminateContractsHttpKernel🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsMailMailQueue🎜🎜🎜Mail::queue()🎜🎜🎜🎜IlluminateContractsMailMailable🎜🎜🎜 🎜🎜🎜🎜 IlluminateContractsMailMailer🎜🎜🎜Mail🎜🎜🎜🎜IlluminateContractsNotificationsDispatcher🎜🎜🎜Notification🎜🎜🎜🎜IlluminateContractsNotificationsFactory🎜🎜🎜Notification 🎜🎜🎜🎜IlluminateContractsPaginationLengthAwarePaginator🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsPaginationPaginator🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsPipelineHub🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsPipelinePipeline🎜🎜🎜 🎜🎜🎜🎜 IlluminateContractsQueueEntityResolver🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsQueueFactory🎜🎜🎜File d'attente🎜🎜🎜🎜IlluminateContractsQueueJob🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsQueueMonitor🎜🎜🎜File d'attente 🎜🎜🎜🎜🎜IlluminateContractsQueueQueue🎜Queue::connection()Queue::connection()
IlluminateContractsQueueQueueableCollection 
IlluminateContractsQueueQueueableEntity 
IlluminateContractsQueueShouldQueue 
IlluminateContractsRedisFactoryRedis
IlluminateContractsRoutingBindingRegistrarRoute
IlluminateContractsRoutingRegistrarRoute
IlluminateContractsRoutingResponseFactoryResponse
IlluminateContractsRoutingUrlGeneratorURL
IlluminateContractsRoutingUrlRoutable 
IlluminateContractsSessionSessionSession::driver()
 
 
 IlluminateContractsRedisFactory
IlluminateContractsRoutingRegistrar
IlluminateContractsRoutingResponseFactoryRéponse
IlluminateContractsRoutingUrlGenerator
 🎜🎜🎜🎜IlluminateContractsSessionSession🎜🎜🎜Session::driver()🎜🎜🎜🎜🎜IlluminateContractsSupportArrayable🎜🎜🎜 🎜🎜🎜🎜🎜Illuminate ContratsSupportHtmlable🎜🎜🎜 🎜🎜🎜🎜 🎜LiluminateContractsSupportjsonable🎜🎜🎜 🎜🎜🎜🎜🎜illuminateContractsSupportMessageBag🎜🎜🎜 🎜🎜🎜🎜🎜LuminateContractsSupportMessageProvider🎜🎜🎜 🎜🎜🎜🎜🎜illuminateContractsSupporTenderable🎜🎜🎜 🎜🎜🎜🎜🎜illuminateContransSponsable🎜🎜🎜 
IlluminateContractsTranslationTranslatorLangLang
IlluminateContractsValidationFactoryValidator
IlluminateContractsValidationImplicitRule 
IlluminateContractsValidationRule 
IlluminateContractsValidationValidatesWhenResolved 
IlluminateContractsValidationValidatorValidator::make()
IlluminateContractsViewEngine 
IlluminateContractsViewFactoryView
IlluminateContractsViewViewView::make()
🎜IlluminateContractsValidationImplicitRule🎜🎜🎜 🎜 🎜🎜🎜IlluminateContractsValidationRule🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsValidationValidatesWhenResolved🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsValidationValidator🎜🎜🎜Validator::make()🎜🎜🎜🎜IlluminateContractsViewEngine🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsViewFactory🎜🎜🎜Voir 🎜🎜🎜🎜IlluminateContractsViewView🎜🎜 View::make()🎜🎜🎜🎜🎜本文章首发在 🎜LearnKu.com🎜 网站上。🎜🎜