Skip to content

Commit

Permalink
Translate file providers.md
Browse files Browse the repository at this point in the history
Issue: GH-15
  • Loading branch information
adielcristo committed Aug 12, 2024
1 parent 67c745c commit 187ef64
Show file tree
Hide file tree
Showing 22 changed files with 305 additions and 233 deletions.
2 changes: 1 addition & 1 deletion arquitetura/ciclo-de-vida.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ Alimente-o com requisições HTTP e ele retornará respostas HTTP.
### Provedores de Serviço

Uma das ações mais importantes de inicialização do _kernel_ é carregar os
[provedores de serviço](../providers.md) da sua aplicação.
[provedores de serviço](provedores.md) da sua aplicação.
Os provedores de serviço são responsáveis pela inicialização de todos os vários
componentes do _framework_, como componentes de banco de dados, fila, validação
e de roteamento.
Expand Down
2 changes: 1 addition & 1 deletion arquitetura/conteiner.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ necessário vincular os serviços do seu pacote ao contêiner.
#### Vinculações Simples

Quase todas as suas vinculações de contêiner de serviço serão registradas nos
[provedores de serviços](../providers.md), portanto, a maioria desses exemplos
[provedores de serviços](provedores.md), portanto, a maioria desses exemplos
demonstrará o uso do contêiner nesse contexto.

Em um provedor de serviço, você sempre tem acesso ao contêiner por meio da
Expand Down
280 changes: 280 additions & 0 deletions arquitetura/provedores.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,280 @@
<!-- source_url: https://github.com/laravel/docs/blob/11.x/providers.md -->
<!-- revision: 910898f77947c560ed9e1017b15314229a4bd1b6 -->
<!-- status: wip -->

# Provedores de Serviços

- [Introdução](#introducao)
- [Escrevendo Provedores de Serviços](#escrevendo-provedores-de-servicos)
- [O Método `register`](#o-metodo-register)
- [O Método `boot`](o-metodo-boot)
- [Registrando Provedores](#registrando-provedores)
- [Provedores Adiados](#provedores-adiados)

## Introdução

Os provedores de serviços são o local central de toda a inicialização da
aplicação Laravel.
Sua aplicação, bem como todos os principais serviços do Laravel, são
inicializados por meio de provedores de serviços.

Mas, o que queremos dizer com “inicializados”? Em geral, queremos dizer **ao
registrar** coisas, incluindo registrar ligações de contêineres de serviço,
ouvintes de eventos, _middleware_ e até rotas.
Os provedores de serviços são o local central para configurar sua aplicação.

O Laravel usa dezenas de provedores de serviços internamente para inicializar
seus principais serviços, como `mailer`, `queue`, `cache` e outros.
Muitos desses provedores são provedores “adiados”, o que significa que não serão
carregados em todas as requisições, mas apenas quando os serviços que fornecem
forem realmente necessários.

Todos os provedores de serviços definidos pela pessoa usuária são registrados no
arquivo `bootstrap/providers.php`.
Na documentação a seguir, você aprenderá como escrever seus próprios provedores
de serviços e registrá-los em sua aplicação Laravel.

> **Nota:**
> Se você quiser saber mais sobre como o Laravel lida com requisições e como
> funciona internamente, verifique nossa documentação sobre o
> [ciclo de vida da requisição](ciclo-de-vida.md) do Laravel.
## Escrevendo Provedores de Serviços

Todos os provedores de serviços estendem a classe
`Illuminate\Support\ServiceProvider`.
A maioria dos provedores de serviços contém um método `register` e um método
`boot`.
No método `register`, você **só deve vincular coisas ao
[contêiner de serviços](conteiner.md)**.
Você nunca deve tentar registrar quaisquer ouvintes de eventos, rotas ou
qualquer outra funcionalidade no método `register`.

O Artisan CLI pode gerar um novo provedor por meio do comando `make:provider`.
O Laravel registrará automaticamente seu novo provedor no arquivo
`bootstrap/providers.php` da sua aplicação:

```shell
php artisan make:provider RiakServiceProvider
```

### O Método `register`

Conforme mencionado anteriormente, no método `register`, você só deve vincular
coisas ao [contêiner de serviços](conteiner.md).
Você nunca deve tentar registrar quaisquer ouvintes de eventos, rotas ou
qualquer outra funcionalidade no método `register`.
Caso contrário, você poderá usar acidentalmente um serviço fornecido por um
provedor de serviço que ainda não foi carregado.

Vamos dar uma olhada em um provedor de serviço básico.
Dentro de qualquer um dos métodos do seu provedor de serviço, você sempre tem
acesso à propriedade `$app` que fornece acesso ao contêiner de serviços:

```php
<?php

namespace App\Providers;

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

class RiakServiceProvider extends ServiceProvider
{
/**
* Registra quaisquer serviços da aplicação.
*/
public function register(): void
{
$this->app->singleton(Connection::class, function (Application $app) {
return new Connection(config('riak'));
});
}
}
```

Este provedor de serviço define apenas um método `register` e usa esse método
para definir uma implementação de `App\Services\Riak\Connection` no contêiner de
serviços.
Se você ainda não se familiarizou com o contêiner de serviços do Laravel,
confira [sua documentação](conteiner.md).

#### As Propriedades `bindings` e `singletons`

Se o seu provedor de serviço registrar muitas ligações simples, você poderá usar
as propriedades `bindings` e `singletons` em vez de registrar manualmente cada
ligação de contêiner.
Quando o provedor de serviço for carregado pelo _framework_, ele verificará
automaticamente essas propriedades e registrará suas ligações:

```php
<?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
{
/**
* Todas as ligações de contêiner que devem ser registradas.
*
* @var array
*/
public $bindings = [
ServerProvider::class => DigitalOceanServerProvider::class,
];

/**
* Todos os singletons de contêiner que devem ser registrados.
*
* @var array
*/
public $singletons = [
DowntimeNotifier::class => PingdomDowntimeNotifier::class,
ServerProvider::class => ServerToolsProvider::class,
];
}
```

### O Método `boot`

Então, e se precisarmos registrar um
[compositor de visualização](../views.md#view-composers) em nosso provedor de
serviço?
Isso deve ser feito no método `boot`.
**Este método é chamado após todos os outros provedores de serviços terem sido
registrados**, ou seja, você tem acesso a todos os outros serviços registrados
pelo _framework_:

```php
<?php

namespace App\Providers;

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

class ComposerServiceProvider extends ServiceProvider
{
/**
* Inicializa quaisquer serviços da aplicação.
*/
public function boot(): void
{
View::composer('view', function () {
// ...
});
}
}
```

#### Injeção de Dependência no Método `boot`

Você pode declarar o tipo das dependências no método `boot` do seu provedor de
serviços.
O [contêiner de serviços](conteiner.md) injetará automaticamente todas as
dependências necessárias:

```php
use Illuminate\Contracts\Routing\ResponseFactory;

/**
* Inicializa quaisquer serviços da aplicação.
*/
public function boot(ResponseFactory $response): void
{
$response->macro('serialized', function (mixed $value) {
// ...
});
}
```

## Registrando Provedores de Serviços

Todos os provedores de serviços são registrados no arquivo de configuração
`bootstrap/providers.php`.
Este arquivo retorna um _array_ que contém os nomes das classes dos provedores
de serviços da sua aplicação:

```php
<?php

return [
App\Providers\AppServiceProvider::class,
];
```

Quando você invoca o comando `make:provider` do Artisan, o Laravel adicionará
automaticamente o provedor gerado ao arquivo `bootstrap/providers.php`.
No entanto, se você criou manualmente a classe do provedor, deverá adicioná-la
manualmente ao _array_:

```php
<?php

return [
App\Providers\AppServiceProvider::class,
App\Providers\ComposerServiceProvider::class,
];
```

## Provedores Adiados

Se o seu provedor estiver registrando **apenas** ligações no
[contêiner de serviços](conteiner.md), você poderá optar por adiar seu registro
até que uma das ligações registradas seja realmente necessária.
Adiar o carregamento de tal provedor melhorará o desempenho da sua aplicação,
uma vez que ele não é carregado do sistema de arquivos a cada requisição.

O Laravel compila e armazena uma lista de todos os serviços fornecidos por
provedores de serviços adiados, juntamente com o nome da classe dos provedores
de serviços.
Assim, somente quando você tenta resolver um desses serviços o Laravel carrega o
provedor de serviços.

Para adiar o carregamento de um provedor, implemente a interface
`\Illuminate\Contracts\Support\DeferrableProvider` e defina um método
`provides`.
O método `provides` deve retornar as ligações do contêiner de serviços
registradas pelo provedor:

```php
<?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
{
/**
* Registra quaisquer serviços da aplicação.
*/
public function register(): void
{
$this->app->singleton(Connection::class, function (Application $app) {
return new Connection($app['config']['riak']);
});
}

/**
* Obtém os serviços fornecidos pelo provedor.
*
* @return array<int, string>
*/
public function provides(): array
{
return [Connection::class];
}
}
```
2 changes: 1 addition & 1 deletion authentication.md
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,7 @@ You should ensure that any route that performs an action which requires recent p
<a name="adding-custom-guards"></a>
## Adding Custom Guards

You may define your own authentication guards using the `extend` method on the `Auth` facade. You should place your call to the `extend` method within a [service provider](providers.md). Since Laravel already ships with an `AppServiceProvider`, we can place the code in that provider:
You may define your own authentication guards using the `extend` method on the `Auth` facade. You should place your call to the `extend` method within a [service provider](arquitetura/provedores.md). Since Laravel already ships with an `AppServiceProvider`, we can place the code in that provider:

<?php

Expand Down
2 changes: 1 addition & 1 deletion blade.md
Original file line number Diff line number Diff line change
Expand Up @@ -1429,7 +1429,7 @@ Because the `color` prop was only passed into the parent (`<x-menu>`), it won't

As previously discussed, anonymous components are typically defined by placing a Blade template within your `resources/views/components` directory. However, you may occasionally want to register other anonymous component paths with Laravel in addition to the default path.

The `anonymousComponentPath` method accepts the "path" to the anonymous component location as its first argument and an optional "namespace" that components should be placed under as its second argument. Typically, this method should be called from the `boot` method of one of your application's [service providers](providers.md):
The `anonymousComponentPath` method accepts the "path" to the anonymous component location as its first argument and an optional "namespace" that components should be placed under as its second argument. Typically, this method should be called from the `boot` method of one of your application's [service providers](arquitetura/provedores.md):

/**
* Bootstrap any application services.
Expand Down
2 changes: 1 addition & 1 deletion collections.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ Collections are "macroable", which allows you to add additional methods to the `

// ['FIRST', 'SECOND']

Typically, you should declare collection macros in the `boot` method of a [service provider](providers.md).
Typically, you should declare collection macros in the `boot` method of a [service provider](arquitetura/provedores.md).

<a name="macro-arguments"></a>
#### Macro Arguments
Expand Down
2 changes: 1 addition & 1 deletion comecando/estrutura.md
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ determinada ação em um recurso.
#### O Diretório `Providers`

O diretório `Providers` contém todos os
[provedores de serviço](../providers.md) da sua aplicação.
[provedores de serviço](../arquitetura/provedores.md) da sua aplicação.
Os provedores de serviço inicializam sua aplicação vinculando serviços no
contêiner de serviço, registrando eventos ou executando qualquer outra tarefa
para preparar sua aplicação para as requisições recebidas.
Expand Down
4 changes: 2 additions & 2 deletions database.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ You may access the raw, underlying PDO instance of a connection using the `getPd
<a name="listening-for-query-events"></a>
### Listening for Query Events

If you would like to specify a closure that is invoked for each SQL query executed by your application, you may use the `DB` facade's `listen` method. This method can be useful for logging queries or debugging. You may register your query listener closure in the `boot` method of a [service provider](providers.md):
If you would like to specify a closure that is invoked for each SQL query executed by your application, you may use the `DB` facade's `listen` method. This method can be useful for logging queries or debugging. You may register your query listener closure in the `boot` method of a [service provider](arquitetura/provedores.md):

<?php

Expand Down Expand Up @@ -298,7 +298,7 @@ If you would like to specify a closure that is invoked for each SQL query execut
<a name="monitoring-cumulative-query-time"></a>
### Monitoring Cumulative Query Time

A common performance bottleneck of modern web applications is the amount of time they spend querying databases. Thankfully, Laravel can invoke a closure or callback of your choice when it spends too much time querying the database during a single request. To get started, provide a query time threshold (in milliseconds) and closure to the `whenQueryingForLongerThan` method. You may invoke this method in the `boot` method of a [service provider](providers.md):
A common performance bottleneck of modern web applications is the amount of time they spend querying databases. Thankfully, Laravel can invoke a closure or callback of your choice when it spends too much time querying the database during a single request. To get started, provide a query time threshold (in milliseconds) and closure to the `whenQueryingForLongerThan` method. You may invoke this method in the `boot` method of a [service provider](arquitetura/provedores.md):

<?php

Expand Down
4 changes: 2 additions & 2 deletions dusk.md
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ You may use the `move` method to move the browser window to a different position
<a name="browser-macros"></a>
### Browser Macros

If you would like to define a custom browser method that you can re-use in a variety of your tests, you may use the `macro` method on the `Browser` class. Typically, you should call this method from a [service provider's](providers.md) `boot` method:
If you would like to define a custom browser method that you can re-use in a variety of your tests, you may use the `macro` method on the `Browser` class. Typically, you should call this method from a [service provider's](arquitetura/provedores.md) `boot` method:

<?php

Expand Down Expand Up @@ -772,7 +772,7 @@ Dusk also provides a `withKeyboard` method, allowing you to fluently perform com
<a name="keyboard-macros"></a>
#### Keyboard Macros

If you would like to define custom keyboard interactions that you can easily re-use throughout your test suite, you may use the `macro` method provided by the `Keyboard` class. Typically, you should call this method from a [service provider's](providers.md) `boot` method:
If you would like to define custom keyboard interactions that you can easily re-use throughout your test suite, you may use the `macro` method provided by the `Keyboard` class. Typically, you should call this method from a [service provider's](arquitetura/provedores.md) `boot` method:

<?php

Expand Down
2 changes: 1 addition & 1 deletion eloquent-relationships.md
Original file line number Diff line number Diff line change
Expand Up @@ -1197,7 +1197,7 @@ You may determine the morph alias of a given model at runtime using the model's

You may use the `resolveRelationUsing` method to define relations between Eloquent models at runtime. While not typically recommended for normal application development, this may occasionally be useful when developing Laravel packages.

The `resolveRelationUsing` method accepts the desired relationship name as its first argument. The second argument passed to the method should be a closure that accepts the model instance and returns a valid Eloquent relationship definition. Typically, you should configure dynamic relationships within the boot method of a [service provider](providers.md):
The `resolveRelationUsing` method accepts the desired relationship name as its first argument. The second argument passed to the method should be a closure that accepts the model instance and returns a valid Eloquent relationship definition. Typically, you should configure dynamic relationships within the boot method of a [service provider](arquitetura/provedores.md):

use App\Models\Order;
use App\Models\Customer;
Expand Down
2 changes: 1 addition & 1 deletion eloquent-resources.md
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ By default, your outermost resource is wrapped in a `data` key when the resource
}
```

If you would like to disable the wrapping of the outermost resource, you should invoke the `withoutWrapping` method on the base `Illuminate\Http\Resources\Json\JsonResource` class. Typically, you should call this method from your `AppServiceProvider` or another [service provider](providers.md) that is loaded on every request to your application:
If you would like to disable the wrapping of the outermost resource, you should invoke the `withoutWrapping` method on the base `Illuminate\Http\Resources\Json\JsonResource` class. Typically, you should call this method from your `AppServiceProvider` or another [service provider](arquitetura/provedores.md) that is loaded on every request to your application:

<?php

Expand Down
2 changes: 1 addition & 1 deletion filesystem.md
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,7 @@ In order to define a custom filesystem you will need a Flysystem adapter. Let's
composer require spatie/flysystem-dropbox
```

Next, you can register the driver within the `boot` method of one of your application's [service providers](providers.md). To accomplish this, you should use the `extend` method of the `Storage` facade:
Next, you can register the driver within the `boot` method of one of your application's [service providers](arquitetura/provedores.md). To accomplish this, you should use the `extend` method of the `Storage` facade:

<?php

Expand Down
Loading

0 comments on commit 187ef64

Please sign in to comment.