bens

Service Providers no Laravel: o que são e como usar Service Providers no Laravel

Os provedores de serviços Laravel são o local central onde o aplicativo é iniciado. Ou seja, os principais serviços do Laravel e serviços de aplicação, classes e suas dependências são colocados no contêiner de serviço por meio de provedores. 

Em outras palavras, os provedores de serviços são como um funil através do qual despejamos combustível de "classe" em um tanque chamado "contêiner de serviço" de um motor chamado Laravel.

Exemplo

Se abrirmos config/app.php veremos um array com o nome “provider”

'providers' => [

        /*
        * Laravel Framework Service Providers...
        */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        .
        .
        .
],

Estes são alguns dos provedores de serviços fornecidos junto com o laravel, ou seja, serviços básicos que são colocados no contêiner de serviço.

Quando eu service provider eles são executados?

Se olharmos para a documentação a pedido ciclo de vida , os seguintes arquivos são executados no início:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php e os seus Middlewares
  • Service Providers: conteúdo deste artigo

Que service provider estão carregados? 

eles são aqueles definites na matriz config/app.php:

return [
 
    // ... other configuration values
 
    'providers' => [
 
        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
 
        // ... other framework providers from /vendor
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,
 
        /*
         * PUBLIC Service Providers - the ones we mentioned above
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
    ],
 
];

Como podemos ver, existe uma lista de service provider não público na pasta /vendor, não devemos tocá-los nem modificá-los. As que nos interessam estão abaixo, com BroadcastServicerProvider desativado por padrão, provavelmente porque raramente é usado.

Todos esses provedores de serviços funcionam de cima para baixo, repetindo a lista duas vezes:

  • A primeira iteração está procurando por um método opcional register(), útil para (eventualmente) executar algo configurado antes do método boot().
  • a segunda iteração executa o método boot() de todos os fornecedores. Novamente, um por um, de cima para baixo, da matriz 'providers'.
  • Finalmente, após todos os provedores de serviços terem sido processados, o Laravel passa a analisar o caminho (rota), executar o controlador, usar modelos, etc.

Provedores de Serviços Laravel prédefiniti

I Service Providers incluídos no Laravel, são todos os presentes na pasta app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

São todas classes PHP, cada uma relacionada ao seu próprio tópico: App, Auth, Broadcasting, Events e Routes. Mas todos eles têm uma coisa em comum: método boot().

Dentro desse método, podemos escrever qualquer código relacionado a qualquer uma dessas seções: auth, events, route, etc Em outras palavras, Service Providers são apenas classes para registrar alguma funcionalidade global.

Eles são separados como "provedores" porque são executados muito cedo no ciclo de vida do aplicativo, portanto, algo global é conveniente aqui antes que o script em execução chegue a Modelos ou Controladores.

A maior parte da funcionalidade está no RouteServiceProvider, aqui está o código:

class RouteServiceProvider extends ServiceProvider
{
    public const HOME = '/dashboard';
 
    public function boot()
    {
        $this->configureRateLimiting();
 
        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->group(base_path('routes/api.php'));
 
            Route::middleware('web')
                ->group(base_path('routes/web.php'));
        });
    }
 
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });
    }
}

Esta é a classe onde os arquivos são configurados route, com routes/web.phproutes/api.php incluído por padrãodefinita. Observe que para a API também existem configurações diferentes: Endpoint prefix /api e middleware api para todos routes.

Podemos editar o service providers, que não estão na pasta /vendor. A personalização desses arquivos é feita quando você tem muitos caminhos e deseja separá-los em arquivos específicos. Você cria routes/auth.php e coloque os caminhos lá, então você "habilita" esse arquivo no método boot() di RouteServiceProvider, basta adicionar a terceira frase:

`Route::middleware('web') // or maybe you want another middleware?
    ->group(base_path('routes/auth.php'));

AppServiceProvider está vazio. Um exemplo típico de adição de código AppServiceProvider, é sobre desabilitar o carregamento lento no Eloquent . Para fazer isso, você só precisa adicione duas linhas no método boot():

Boletim de inovação
Não perca as notícias mais importantes sobre inovação. Cadastre-se para recebê-los por e-mail.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Isso lançará uma exceção se um modelo de relacionamento não for carregado.

Crie o seu próprio service provider personalizado

Além dos arquivos prédefinites, podemos facilmente criar um novo Service Provider, relacionados a outros tópicos além dos prédefiterminou como auth/event/routes.

Um exemplo bastante típico é a configuração de exibição Blade. Podemos criar uma diretiva Bladee, em seguida, adicione esse código ao método boot() de qualquer service provider, incluindo o padrão AppServiceProvider. Vamos agora criar um ViewServiceProvider separado.

Podemos gerá-lo com este comando:

php artisan make:provider ViewServiceProvider

Que irá gerar a classe tão prédefinoite:

namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
 
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

Como podemos ver dentro, existem dois métodos:

O método register()

O método register() nos permite defilinks finais para nosso contêiner de serviço. Por exemplo, no seguinte código:

public function register()
{
    $this->app->singleton(my_class, function($app){
        return new MyClass($app);
    });
}

$this->app é uma variável global em laravel que uma classe singleton pode acessar através do aplicativo.

Singleton é um recurso. Ao aplicar esse recurso, estamos informando ao aplicativo que qualquer classe que for passada como parâmetro no aplicativo deverá ter apenas uma instância em todo o aplicativo. Isso significa que MyClass será resolvido uma vez e terá apenas uma instância, que pode ser acessada usando a variável my_class.

O método boot()

O método boot() permite acessar todos os serviços previamente cadastrados através do método register. Você pode então incluir todo o serviço em seu aplicativo usando este método.

Voltando ao exemplo anterior, vamos remover o método register() e dentro boot() adicione o código da diretiva Blade:

use Illuminate\Support\Facades\Blade;
 
public function boot()
{
    Blade::directive('datetime', function ($expression) {
        return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
    });
}

Outro exemplo de ViewServiceProvider lembranças View Composers, aqui está o trecho do site oficial do Laravel :

use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // Using class based composers...
        View::composer('profile', ProfileComposer::class);
 
        // Using closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }
}

Para executar, este novo provedor deve ser adicionado/registrado no array de provedores config/app.php:

return [
    // ... other configuration values
 
    'providers' => [
 
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
        // Add your provider here
        App\Providers\ViewServiceProvider::class,
    ],
];

Ercole Palmeri

Eles também podem estar interessados ​​em:

Boletim de inovação
Não perca as notícias mais importantes sobre inovação. Cadastre-se para recebê-los por e-mail.

Artigos recentes

Editoras e OpenAI assinam acordos para regular o fluxo de informações processadas por Inteligência Artificial

Na segunda-feira passada, o Financial Times anunciou um acordo com a OpenAI. O FT licencia seu jornalismo de classe mundial…

Abril 30 2024

Pagamentos online: veja como os serviços de streaming fazem você pagar para sempre

Milhões de pessoas pagam por serviços de streaming, pagando assinaturas mensais. É opinião comum que você…

Abril 29 2024

A Veeam oferece o suporte mais abrangente para ransomware, desde proteção até resposta e recuperação

A Coveware by Veeam continuará a fornecer serviços de resposta a incidentes de extorsão cibernética. A Coveware oferecerá recursos forenses e de remediação…

Abril 23 2024

Revolução Verde e Digital: Como a Manutenção Preditiva está Transformando a Indústria de Petróleo e Gás

A manutenção preditiva está revolucionando o setor de petróleo e gás, com uma abordagem inovadora e proativa para o gerenciamento de plantas.…

Abril 22 2024