Estamos actualizando el sitio. Durante unos días es posible que veas fallos de diseño o de traducción. La documentación sigue disponible: si una página se ve mal, recárgala más tarde.

Inicio Laravel 10.x Contratos

Contratos

10.x 7 de mar. de 2026

#Introducción

Los "contratos" de Laravel son un conjunto de interfaces que definen los servicios principales que ofrece 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 varios drivers, y una implementación de mailer que funciona con Symfony Mailer.

Todos los contratos de Laravel se encuentran en su propio repositorio de GitHub. Esto proporciona un punto de referencia rápido para todos los contratos disponibles, así como un paquete independiente que puede utilizarse al crear paquetes que interactúan con los servicios de Laravel.

#Contratos vs. Facades

Los facades y funciones helper de Laravel ofrecen una forma sencilla de utilizar los servicios de Laravel sin necesidad de hacer type-hint y resolver contratos desde el service container. En la mayoría de los casos, cada facade tiene un contrato equivalente.

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

#Cuándo usar contratos

La decisión de usar contratos o facades dependerá del gusto personal y del equipo de desarrollo. Tanto los contratos como los facades pueden usarse para crear aplicaciones Laravel robustas y bien probadas. Contratos y facades no son mutuamente excluyentes. Algunas partes de su aplicación pueden usar facades mientras otras dependen de contratos. Mientras mantenga las responsabilidades de sus clases enfocadas, notará muy pocas diferencias prácticas entre usar contratos y facades.

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

#Cómo usar contratos

Entonces, ¿cómo obtener una implementación de un contrato? En realidad es bastante sencillo.

Muchos tipos de clases en Laravel se resuelven a través del service container, incluyendo controladores, listeners de eventos, middleware, trabajos en cola e incluso closures de rutas. Por lo tanto, para obtener una implementación de un contrato, simplemente puede hacer "type-hint" de la interfaz en el constructor de la clase que se está resolviendo.

Por ejemplo, eche 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
{
    /**
     * Crear una nueva instancia del manejador de eventos.
     */
    public function __construct(
        protected Factory $redis,
    ) {}

    /**
     * Manejar el evento.
     */
    public function handle(OrderWasPlaced $event): void
    {
        // ...
    }
}

Cuando se resuelve el listener de eventos, el service container leerá los type-hints en el constructor de la clase e inyectará el valor apropiado. Para aprender más sobre cómo registrar cosas en el service container, consulte su documentación.

#Referencia de contratos

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

Contract References 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\Bus\Dispatcher Bus
Illuminate\Contracts\Bus\QueueingDispatcher Bus::dispatchToQueue()
Illuminate\Contracts\Broadcasting\Factory Broadcast
Illuminate\Contracts\Broadcasting\Broadcaster Broadcast::connection()
Illuminate\Contracts\Broadcasting\ShouldBroadcast  
Illuminate\Contracts\Broadcasting\ShouldBroadcastNow  
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\MailQueue Mail::queue()
Illuminate\Contracts\Mail\Mailable  
Illuminate\Contracts\Mail\Mailer Mail
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\ImplicitRule  
Illuminate\Contracts\Validation\Rule  
Illuminate\Contracts\Validation\ValidatesWhenResolved  
Illuminate\Contracts\Validation\Validator Validator::make()
Illuminate\Contracts\View\Engine  
Illuminate\Contracts\View\Factory View
Illuminate\Contracts\View\View View::make()