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 Proveedores de Servicios

Proveedores de Servicios

10.x 7 de mar. de 2026

#Introducción

Los proveedores de servicios son el punto central para el arranque de toda aplicación Laravel. Su propia aplicación, así como todos los servicios centrales de Laravel, se inicializan a través de proveedores de servicios.

Pero, ¿qué queremos decir con "arranque"? En general, nos referimos a registrar cosas, incluyendo el registro de enlaces en el contenedor de servicios, listeners de eventos, middleware e incluso rutas. Los proveedores de servicios son el lugar central para configurar su aplicación.

Si abre el archivo config/app.php incluido con Laravel, verá un arreglo providers. Estos son todas las clases de proveedores de servicios que se cargarán para su aplicación. Por defecto, un conjunto de proveedores de servicios centrales de Laravel están listados en este arreglo. Estos proveedores inicializan los componentes centrales de Laravel, como el mailer, queue, cache y otros. Muchos de estos proveedores son proveedores "diferidos", lo que significa que no se cargarán en cada solicitud, sino solo cuando los servicios que proveen sean realmente necesarios.

En esta descripción general, aprenderá cómo escribir sus propios proveedores de servicios y registrarlos en su aplicación Laravel.

Примечание

Si desea aprender más sobre cómo Laravel maneja las solicitudes y funciona internamente, consulte nuestra documentación sobre el ciclo de vida de la solicitud de Laravel.

#Escribiendo Proveedores de Servicios

Todos los proveedores de servicios extienden la clase Illuminate\Support\ServiceProvider. La mayoría de los proveedores de servicios contienen un método register y un método boot. Dentro del método register, usted debe solo enlazar cosas en el contenedor de servicios. Nunca debe intentar registrar listeners de eventos, rutas o cualquier otra funcionalidad dentro del método register.

La CLI Artisan puede generar un nuevo proveedor mediante el comando make:provider:

php artisan make:provider RiakServiceProvider

#El Método Register

Como se mencionó anteriormente, dentro del método register, solo debe enlazar cosas en el contenedor de servicios. Nunca debe intentar registrar listeners de eventos, rutas o cualquier otra funcionalidad dentro del método register. De lo contrario, podría usar accidentalmente un servicio que es provisto por un proveedor de servicios que aún no se ha cargado.

Veamos un proveedor de servicios básico. Dentro de cualquiera de los métodos de su proveedor de servicios, siempre tiene acceso a la propiedad $app que proporciona acceso al contenedor de servicios:

<?php

namespace App\Providers;

use App\Services\Riak\Connection;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\ServiceProvider;

class RiakServiceProvider extends ServiceProvider
{
    /**
     * Registrar cualquier servicio de la aplicación.
     */
    public function register(): void
    {
        $this->app->singleton(Connection::class, function (Application $app) {
            return new Connection(config('riak'));
        });
    }
}

Este proveedor de servicios solo define un método register, y usa ese método para definir una implementación de App\Services\Riak\Connection en el contenedor de servicios. Si aún no está familiarizado con el contenedor de servicios de Laravel, consulte su documentación.

#Las propiedades bindings y singletons

Si su proveedor de servicios registra muchos enlaces simples, puede que desee usar las propiedades bindings y singletons en lugar de registrar manualmente cada enlace en el contenedor. Cuando el framework carga el proveedor de servicios, automáticamente verificará estas propiedades y registrará sus enlaces:

<?php

namespace App\Providers;

use App\Contracts\DowntimeNotifier;
use App\Contracts\ServerProvider;
use App\Services\DigitalOceanServerProvider;
use App\Services\PingdomDowntimeNotifier;
use App\Services\ServerToolsProvider;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Todos los enlaces del contenedor que deben registrarse.
     *
     * @var array
     */
    public $bindings = [
        ServerProvider::class => DigitalOceanServerProvider::class,
    ];

    /**
     * Todos los singletons del contenedor que deben registrarse.
     *
     * @var array
     */
    public $singletons = [
        DowntimeNotifier::class => PingdomDowntimeNotifier::class,
        ServerProvider::class => ServerToolsProvider::class,
    ];
}

#El Método Boot

Entonces, ¿qué pasa si necesitamos registrar un view composer dentro de nuestro proveedor de servicios? Esto debe hacerse dentro del método boot. Este método se llama después de que todos los demás proveedores de servicios han sido registrados, lo que significa que tiene acceso a todos los demás servicios que han sido registrados por el framework:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Inicializar cualquier servicio de la aplicación.
     */
    public function boot(): void
    {
        View::composer('view', function () {
            // ...
        });
    }
}

#Inyección de Dependencias en el Método Boot

Puede indicar dependencias para el método boot de su proveedor de servicios. El contenedor de servicios inyectará automáticamente cualquier dependencia que necesite:

use Illuminate\Contracts\Routing\ResponseFactory;

/**
 * Inicializar cualquier servicio de la aplicación.
 */
public function boot(ResponseFactory $response): void
{
    $response->macro('serialized', function (mixed $value) {
        // ...
    });
}

#Registrando Proveedores

Todos los proveedores de servicios se registran en el archivo de configuración config/app.php. Este archivo contiene un arreglo providers donde puede listar los nombres de clase de sus proveedores de servicios. Por defecto, un conjunto de proveedores de servicios centrales de Laravel están registrados en este arreglo. Los proveedores predeterminados inicializan los componentes centrales de Laravel, como el mailer, queue, cache y otros.

Para registrar su proveedor, agréguelo al arreglo:

'providers' => ServiceProvider::defaultProviders()->merge([
    // Otros Proveedores de Servicios

    App\Providers\ComposerServiceProvider::class,
])->toArray(),

#Proveedores Diferidos

Si su proveedor solo registra enlaces en el contenedor de servicios, puede optar por diferir su registro hasta que uno de los enlaces registrados sea realmente necesario. Diferir la carga de dicho proveedor mejorará el rendimiento de su aplicación, ya que no se cargará desde el sistema de archivos en cada solicitud.

Laravel compila y almacena una lista de todos los servicios suministrados por proveedores de servicios diferidos, junto con el nombre de su clase de proveedor de servicios. Luego, solo cuando intenta resolver uno de estos servicios, Laravel carga el proveedor de servicios.

Para diferir la carga de un proveedor, implemente la interfaz \Illuminate\Contracts\Support\DeferrableProvider y defina un método provides. El método provides debe devolver los enlaces del contenedor de servicios registrados por el proveedor:

<?php

namespace App\Providers;

use App\Services\Riak\Connection;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\ServiceProvider;

class RiakServiceProvider extends ServiceProvider implements DeferrableProvider
{
    /**
     * Registrar cualquier servicio de la aplicación.
     */
    public function register(): void
    {
        $this->app->singleton(Connection::class, function (Application $app) {
            return new Connection($app['config']['riak']);
        });
    }

    /**
     * Obtener los servicios proporcionados por el proveedor.
     *
     * @return array<int, string>
     */
    public function provides(): array
    {
        return [Connection::class];
    }
}