Registro Rápido de Servicios en el Contenedor de Laravel

Spread the love

Cuando queires vinculan servicios en el contenedor, normalmente los registras con el método register() del la clase App\Providers\AppServiceProvider.

Sin embargo, hay otra forma rápida de enlazar tus servicios.

Vamos suponer que tienes el siguiente código:

namespace App\Repositories;

class PostRepository implements PostRepositoryInterface
{

}

Si después de implementar este contrato quieres aprovechar la inyección de dependencias de Laravel, tienes que instruir al contenedor para que sepa que implementación debe de usar cuando se le pida inyectar la interfaz en alguna clase.

Y esto lo tienes que indicar en el método register de la siguiente forma:

namespace App\Repositories;

use Illuminate\Support\ServiceProvider;

class BackendServiceProvider extends ServiceProvider
{

    public function register()
    {
        $this->app->bind(
            PostRepositoryInterface::class,
            PostRepository::class
        );
    }
}

Esta es la forma que todos normalmente hacemos, y esto esta bien cuando nuestro servicio requiere parámetros adicionales en su construcción (otras clases, leer del config, etc).

Sin embargo, cuando nuestro servicio es bastante simple como en nuestro caso, podemos omitir el método register, y utilizar la propiedades $bindings y $singletons.

Las propiedades bindings y singletons

Si tu proveedor de servicios solo requiere registrar clases o interfaces sencillas, solo necesitas utilizar las propiedades bindings y singletons en lugar de registrar manualmente cada enlace en el contenedor.

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * All of the container bindings that should be registered.
     */
    public $bindings = [
        PostRepositoryInterface::class => PostRepository::class,
    ];

    /**
     * All of the container singletons that should be registered.
     */
    public $singletons = [
        SomeService::class => SomeImplementService::class,
    ];
}

Esto es muy útil cuando tenemos que registrar muchas clases que no requieren configuración adicional, lo que permite tener un contenedor mas sencillo y fácil de leer.

Si tienes alguna duda deja un mensaje en los comentarios 👍🏼