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.
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.
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 artigoQue 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:
register()
, útil para (eventualmente) executar algo configurado antes do método boot()
.boot()
de todos os fornecedores. Novamente, um por um, de cima para baixo, da matriz 'providers'
.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.php
e routes/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()
:
// 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.
service provider
personalizadoAlé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 Blade
e, 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() 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() 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:
Na segunda-feira passada, o Financial Times anunciou um acordo com a OpenAI. O FT licencia seu jornalismo de classe mundial…
Milhões de pessoas pagam por serviços de streaming, pagando assinaturas mensais. É opinião comum que você…
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…
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.…