Buscar..


Introducción

Laravel permite el acceso a una variedad de clases llamadas Servicios. Algunos servicios están disponibles de forma inmediata, pero puede crearlos usted mismo.

Un servicio se puede utilizar en varios archivos de la aplicación, como controladores. Imaginemos un servicio OurService implementando un método getNumber() que devuelve un número aleatorio:

class SomeController extends Controller {
    
    public function getRandomNumber()
    {
        return app(OurService::class)->getNumber();
    }
}

Para crear un servicio, solo se necesita crear una nueva clase:

# app/Services/OurService/OurService.php

<?php
namespace App\Services\OurService;

class OurService 
{
    public function getNumber()
    {
        return rand();
    }
}

En este momento, ya podría utilizar este servicio en un controlador, pero tendría que crear una instancia de un nuevo objeto cada vez que lo necesitaría:

class SomeController extends Controller {
    
    public function getRandomNumber()
    {
        $service = new OurService();
        return $service->getNumber();
    }

    public function getOtherRandomNumber()
    {
        $service = new OurService();
        return $service->getNumber();
    }
}

Es por eso que el siguiente paso es registrar su servicio en el contenedor de servicios . Cuando registra su Servicio en el Contenedor de Servicios, no necesita crear un nuevo objeto cada vez que lo necesite.

Para registrar un servicio en el contenedor de servicios, debe crear un proveedor de servicios . Este proveedor de servicios puede:

  1. Registre su servicio en el contenedor de servicios con el método de registro )
  2. Inyectar otros servicios en su servicio (dependencias) con el método de arranque

Un proveedor de servicios es una clase que extiende la clase abstracta Illuminate\Support\ServiceProvider . Necesita implementar el método de register() para registrar un Servicio en el Contenedor de Servicios :

# app/Services/OurService/OurServiceServiceProvider.php

<?php
namespace App\Services\OurService;

use Illuminate\Support\ServiceProvider;

class OurServiceServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('OurService', function($app) {
            return new OurService();
        });
    }
}

Todos los proveedores de servicios se guardan en una matriz en config/app.php . Por lo tanto, debemos registrar nuestro Proveedor de servicios en esta matriz:

return [

    ...

    'providers' => [

        ...

        App\Services\OurService\OurServiceServiceProvider::class,

        ...

    ],

    ...

];

Ahora podemos acceder a nuestro Servicio en un controlador. Tres posibilidades:

  1. Inyección de dependencia:
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

class SomeController extends Controller
{
    public function __construct(OurService $our_service)
    {
        dd($our_service->getNumber());
    }
}
  1. Acceso a través de la app() helper:
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

class SomeController extends Controller
{
    public function getRandomNumber()
    {
        return app('OurService')->getNumber();
    }
}

Laravel proporciona fachadas, clases imaginarias que puede utilizar en todos sus proyectos y reflejar un Servicio. Para acceder a su servicio más fácilmente, puede crear una fachada:

<?php
namespace App\Http\Controllers;

use Randomisator;

class SomeController extends Controller
{
    public function getRandomNumber()
    {
        return Randomisator::getNumber();
    }

}

Para crear una nueva fachada, debe crear una nueva clase que amplíe Illuminate\Support\Facades\Facade . Esta clase necesita implementar el método getFacadeAccessor() y devolver el nombre de un servicio registrado por un proveedor de servicios :

# app/Services/OurService/OurServiceFacade.php

<?php
namespace App\Services\OurService;

use Illuminate\Support\Facades\Facade;

class OurServiceFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'OurService';
    }
}

También debe registrar su fachada en config/app.php :

return [

    ...

    'aliases' => [

        ....

        'Randomisator' => App\Services\OurService\OurServiceFacade::class,
    ],

];

La Fachada ahora es accesible en cualquier parte de tu proyecto.

Si desea acceder a su servicio desde sus vistas, puede crear una función auxiliar. Laravel se envía con algunas funciones de ayuda fuera de la caja, como la función auth() o la función view() . Para crear una función auxiliar, cree un nuevo archivo:

# app/Services/OurService/helpers.php    

if (! function_exists('randomisator')) {
    /**
     * Get the available OurService instance.
     *
     * @return \App\ElMatella\FacebookLaravelSdk
     */
    function randomisator()
    {
        return app('OurService');
    }
}

También necesita registrar este archivo, pero en su archivo composer.json :

{

    ...

    "autoload": {
        "files": [
            "app/Services/OurService/helpers.php"
        ],

        ...
    }
}

Ahora puedes usar este ayudante en una vista:

<h1>Here is a random number: {{ randomisator()->getNumber() }}</h1>


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow