Contracts

Contracts

Introduction

Los “contratos” de Laravel son un conjunto de interfaces que definen los servicios centrales proporcionados por el framework. Por ejemplo, un contrato Illuminate\Contracts\Queue\Queue define los métodos necesarios para encolar trabajos, mientras que el contrato Illuminate\Contracts\Mail\Mailer define los métodos necesarios para enviar correos electrónicos.

Cada contrato tiene una implementación correspondiente proporcionada por el framework. Por ejemplo, Laravel ofrece una implementación de cola con una variedad de controladores, y una implementación de correo que está alimentada por Symfony Mailer.

Todos los contratos de Laravel viven en su propio repositorio de GitHub. Esto proporciona un punto de referencia rápido para todos los contratos disponibles, así como un paquete único y desacoplado que se puede utilizar al construir paquetes que interactúan con los servicios de Laravel.

Contracts vs. Facades

Las facades y las funciones helper de Laravel proporcionan una forma sencilla de utilizar los servicios de Laravel sin necesidad de utilizar type-hinting y resolver contratos del contenedor de servicios. En la mayoría de los casos, cada facade tiene un contrato equivalente.

A diferencia de las facades, que no requieren que las incluyas en el constructor de tu clase, los contratos te permiten definir dependencias explícitas para tus clases. Algunos desarrolladores prefieren definir sus dependencias de esta manera y, por lo tanto, prefieren usar contratos, mientras que otros desarrolladores disfrutan de la conveniencia de las facades. En general, la mayoría de las aplicaciones pueden usar facades sin problemas durante el desarrollo.

When to Use Contracts

La decisión de usar contratos o fachadas dependerá del gusto personal y de los gustos de tu equipo de desarrollo. Tanto los contratos como las fachadas se pueden utilizar para crear aplicaciones Laravel robustas y bien probadas. Los contratos y las fachadas no son mutuamente excluyentes. Algunas partes de tus aplicaciones pueden usar fachadas mientras que otras dependen de contratos. Siempre que mantengas las responsabilidades de tu clase enfocadas, notarás muy pocas diferencias prácticas entre el uso de contratos y fachadas.

En general, la mayoría de las aplicaciones pueden usar facades sin problemas durante el desarrollo. Si estás creando un paquete que se integra con múltiples frameworks PHP, es posible que desees usar el paquete illuminate/contracts para definir tu integración con los servicios de Laravel sin necesidad de requerir las implementaciones concretas de Laravel en el archivo composer.json de tu paquete.

How to Use Contracts

Entonces, ¿cómo obtienes una implementación de un contrato? En realidad, es bastante simple. Many tipos de clases en Laravel se resuelven a través del contenedor de servicios, incluyendo controladores, oyentes de eventos, middleware, trabajos en cola e incluso funciones anónimas de ruta. Así que, para obtener una implementación de un contrato, solo puedes “sugerir el tipo” de la interfaz en el constructor de la clase que se está resolviendo. Por ejemplo, echa un vistazo a este listener de eventos:

<?php
 
namespace App\Listeners;
 
use App\Events\OrderWasPlaced;
use App\Models\User;
use Illuminate\Contracts\Redis\Factory;
 
class CacheOrderInformation
{
    /**
     * Create a new event handler instance.
     */
    public function __construct(
        protected Factory $redis,
    ) {}
 
    /**
     * Handle the event.
     */
    public function handle(OrderWasPlaced $event): void
    {
        // ...
    }
}

Cuando se resuelve el listener del evento, el contenedor de servicios leerá las indicaciones de tipo en el constructor de la clase y inyectará el valor apropiado. Para aprender más sobre cómo registrar cosas en el contenedor de servicios, consulta su documentación.

Contract Reference

Esta tabla proporciona una referencia rápida a todos los contratos de Laravel y sus equivalentes en facades:

Contrato Referencias Facade
Illuminate\Contracts\Auth\Access\Authorizable
Illuminate\Contracts\Auth\Access\Gate Gate
Illuminate\Contracts\Auth\Authenticatable
Illuminate\Contracts\Auth\CanResetPassword
Illuminate\Contracts\Auth\Factory Auth
Illuminate\Contracts\Auth\Guard Auth::guard()
Illuminate\Contracts\Auth\PasswordBroker Password::broker()
Illuminate\Contracts\Auth\PasswordBrokerFactory Password
Illuminate\Contracts\Auth\StatefulGuard
Illuminate\Contracts\Auth\SupportsBasicAuth
Illuminate\Contracts\Auth\UserProvider
Illuminate\Contracts\Broadcasting\Broadcaster Broadcast::connection()
Illuminate\Contracts\Broadcasting\Factory Broadcast
Illuminate\Contracts\Broadcasting\ShouldBroadcast
Illuminate\Contracts\Broadcasting\ShouldBroadcastNow
Illuminate\Contracts\Bus\Dispatcher Bus
Illuminate\Contracts\Bus\QueueingDispatcher Bus::dispatchToQueue()
Illuminate\Contracts\Cache\Factory Cache
Illuminate\Contracts\Cache\Lock
Illuminate\Contracts\Cache\LockProvider
Illuminate\Contracts\Cache\Repository Cache::driver()
Illuminate\Contracts\Cache\Store
Illuminate\Contracts\Config\Repository Config
Illuminate\Contracts\Console\Application
Illuminate\Contracts\Console\Kernel Artisan
Illuminate\Contracts\Container\Container App
Illuminate\Contracts\Cookie\Factory Cookie
Illuminate\Contracts\Cookie\QueueingFactory Cookie::queue()
Illuminate\Contracts\Database\ModelIdentifier
Illuminate\Contracts\Debug\ExceptionHandler
Illuminate\Contracts\Encryption\Encrypter Crypt
Illuminate\Contracts\Events\Dispatcher Event
Illuminate\Contracts\Filesystem\Cloud Storage::cloud()
Illuminate\Contracts\Filesystem\Factory Storage
Illuminate\Contracts\Filesystem\Filesystem Storage::disk()
Illuminate\Contracts\Foundation\Application App
Illuminate\Contracts\Hashing\Hasher Hash
Illuminate\Contracts\Http\Kernel
Illuminate\Contracts\Mail\Mailable
Illuminate\Contracts\Mail\Mailer Mail
Illuminate\Contracts\Mail\MailQueue Mail::queue()
Illuminate\Contracts\Notifications\Dispatcher Notification
Illuminate\Contracts\Notifications\Factory Notification
Illuminate\Contracts\Pagination\LengthAwarePaginator
Illuminate\Contracts\Pagination\Paginator
Illuminate\Contracts\Pipeline\Hub
Illuminate\Contracts\Pipeline\Pipeline Pipeline
Illuminate\Contracts\Queue\EntityResolver
Illuminate\Contracts\Queue\Factory Queue
Illuminate\Contracts\Queue\Job
Illuminate\Contracts\Queue\Monitor Queue
Illuminate\Contracts\Queue\Queue Queue::connection()
Illuminate\Contracts\Queue\QueueableCollection
Illuminate\Contracts\Queue\QueueableEntity
Illuminate\Contracts\Queue\ShouldQueue
Illuminate\Contracts\Redis\Factory Redis
Illuminate\Contracts\Routing\BindingRegistrar Route
Illuminate\Contracts\Routing\Registrar Route
Illuminate\Contracts\Routing\ResponseFactory Response
Illuminate\Contracts\Routing\UrlGenerator URL
Illuminate\Contracts\Routing\UrlRoutable
Illuminate\Contracts\Session\Session Session::driver()
Illuminate\Contracts\Support\Arrayable
Illuminate\Contracts\Support\Htmlable
Illuminate\Contracts\Support\Jsonable
Illuminate\Contracts\Support\MessageBag
Illuminate\Contracts\Support\MessageProvider
Illuminate\Contracts\Support\Renderable
Illuminate\Contracts\Support\Responsable
Illuminate\Contracts\Translation\Loader
Illuminate\Contracts\Translation\Translator Lang
Illuminate\Contracts\Validation\Factory Validator
Illuminate\Contracts\Validation\ValidatesWhenResolved
Illuminate\Contracts\Validation\ValidationRule
Illuminate\Contracts\Validation\Validator Validator::make()
Illuminate\Contracts\View\Engine
Illuminate\Contracts\View\Factory View
Illuminate\Contracts\View\View View::make()