Featured image of post Quais são as diferenças lógicas entre bind(), singleton(), scoped() e instance() no Laravel? Em que cenários eles podem ser usados?

Quais são as diferenças lógicas entre bind(), singleton(), scoped() e instance() no Laravel? Em que cenários eles podem ser usados?

Quais são as diferenças lógicas entre bind(), singleton(), scoped() e instance() no Laravel? Em que cenários eles podem ser usados?

Comparação de Métodos de Binding de Objetos no Service Container do Laravel

Método bind() singleton() scoped() instance()
Descrição Cria uma nova instância toda vez que é resolvido. Cria apenas uma instância e retorna a mesma instância em requisições subsequentes. Cria apenas uma instância dentro de cada ciclo de vida de requisição/job; é limpo após o término da requisição. Vincula (bind) uma instância existente ao container e retorna essa instância toda vez que é resolvido.
Prós - Uma instância nova para cada requisição, sem problemas de compartilhamento de estado
- Uso de memória limpo
- Adequado para lógica que requer estado independente
- Pode fornecer configuração única para cada requisição
- Economiza recursos do sistema criando uma instância apenas uma vez
- Garante consistência de estado
- Adequado para compartilhar configuração e recursos
- Melhor desempenho em situações de alta concorrência
- Equilibra uso de memória e compartilhamento de estado
- Compartilha estado dentro de uma requisição, mas isolado entre requisições
- Adequado para cenários de Requisição Web
- Controle total sobre o momento de criação da instância
- Pode pré-configurar o estado da instância
- Adequado para serviços que requerem configuração específica
Contras - Requer mais recursos do sistema para criar instâncias repetidamente
- Pode afetar o desempenho sob alta concorrência
- Não adequado para cenários que requerem estado compartilhado
- Pode causar problemas de desempenho porque uma nova instância é criada a cada vez.
- Estado compartilhado pode levar a bugs difíceis de rastrear
- Não adequado para cenários que requerem estado independente
- O uso de memória persiste até que o programa termine
- Testes requerem atenção especial ao reset de estado
- Se a instância mantiver estado, pode causar comportamento inesperado.
- Pode causar problemas em tarefas de longa duração
- Requer compreensão do ciclo de vida da requisição
- Não adequado para comandos CLI
- Menos flexível
- Não é possível ajustar dinamicamente a configuração da instância
- Pode ocupar memória na inicialização
- Não adequado para casos que requerem carregamento tardio (lazy loading) ou múltiplas instâncias.
Caso de Uso Para serviços de curta duração ou classes que requerem estado independente. Para serviços compartilhados globalmente, como loggers ou gerenciadores de configuração. Para serviços que precisam manter o estado dentro de uma requisição, mas não entre requisições, como conexões de banco de dados. Quando você já tem uma instância e quer reutilizá-la, como um objeto de configuração compartilhado.
Exemplo Quando você tem uma classe Product e quer criar uma nova instância de Product toda vez que dados de produtos diferentes são solicitados. Quando você tem uma classe Logger e quer que todas as operações de escrita de log usem a mesma instância para manter a consistência. Quando você tem uma classe ShoppingCart e precisa compartilhar o estado do carrinho de compras dentro da mesma requisição. Quando você tem uma classe DatabaseConfig e precisa definir parâmetros de conexão quando a aplicação inicia.

Exemplos

Usando bind()

$this->app->bind('Product', function () {
 return new Product();
});

Toda vez que app('Product') é chamado, retorna uma nova instância de Product.

Usando singleton()

$this->app->singleton('Logger', function () {
 return new Logger();
});

Toda vez que app('Logger') é chamado, retorna a mesma instância de Logger.

Usando scoped()

$this->app->scoped(Transistor::class, function (Application $app) {
    return new Transistor($app->make(PodcastParser::class));
});

Compartilha a mesma instância dentro do mesmo ciclo de vida de requisição; requisições diferentes criarão novas instâncias.

Usando instance()


$service = new Transistor(new PodcastParser);
 
$this->app->instance(Transistor::class, $service);

Vincula diretamente uma instância existente ao container.

Resumo

O Laravel atualmente pode ser aplicado em muitos tipos diferentes de cenários, como Requisições Web, Comandos CLI, Jobs de Fila, Comandos de Console, etc.

Portanto, ao escolher qual método de binding usar, você precisa considerar as necessidades do serviço em diferentes cenários e se você precisa compartilhar estado ou configuração.

Reference

All rights reserved,未經允許不得隨意轉載
Criado com Hugo
Tema Stack desenvolvido por Jimmy