Services
Um Service (Provider) no aplicativo Hello Framework registra e disponibiliza serviços globalmente durante todo o ciclo de vida da aplicação.
Introdução
Os Services são o ponto central de inicialização do aplicativo em um projeto Hello Framework. Tanto o seu próprio aplicativo quanto todos os principais serviços do Hello são inicializados por meio de classes estendidas do ServiceProvider. Ao contrário do conceito de middlewares, que exigem uma rota associada para serem executados, os services são sempre executados durante a inicialização do aplicativo, permitindo controlar o fluxo contínuo da aplicação.
Ao estender a classe ServiceProvider, é possível acessar métodos para interromper o fluxo, o que pode ser implementado em seu algoritmo lógico personalizado, além de utilizar métodos para disponibilizar serviços ou aprimorar funções personalizadas em qualquer ponto de uma aplicação Hello. Os services podem ser uma excelente opção para estender as funcionalidades do framework, implementar camadas de segurança e disponibilizar funções auxiliares personalizadas, uma vez que sua propagação no sistema ocorre imediatamente após qualquer requisição HTTP.
Por padrão, o aplicativo Hello já possui alguns services registrados. Um deles é responsável pelo controle de token CSRF e outro pela inicialização dos arquivos de rotas (RouteServiceProvider). É altamente recomendado manter os services padrão da aplicação inalterados.
Criando um serviço
Para criar um service personalizado, você pode utilizar o Hello CLI, que criará automaticamente uma classe que estenderá a classe ServiceProvider. Veja o exemplo abaixo:
php hello make:service MeuService
O comando acima irá criar uma classe de service no diretório "app/services" com a seguinte estrutura de código:
<?php
namespace App\Services;
use Kernel\Http\ServiceProvider;
class MeuService extends ServiceProvider
{
public function boot()
{
// Seu código aqui...
// $this->register('nome_do_seu_registro');
}
}
Registrando um serviço
Lembre-se de que, ao criar uma classe de serviço, é necessário registrá-la no arquivo services.php localizado no diretório config, na raiz do seu projeto. Esse arquivo deve retornar obrigatoriamente um array associativo, em que as chaves representam o nome do serviço registrado e serão inicializadas automaticamente, e os valores correspondem ao namespace da classe de serviço.
<?php
return array(
'CSRF'=>App\Services\CSRF::class,
'Route'=>App\Services\RouteServiceProvider::class,
'Meu'=>App\Services\MeuService::class
);
Métodos herdados da classe ServiceProvider: Facilitando o Registro de Serviços
Abaixo está a lista de métodos que podem ser utilizados na classe de service. É importante ressaltar que o método "boot" é o principal e é responsável por executar toda a lógica aplicada no seu service, disparando assim a propagação.
boot
()
: Método principal que contém a lógica a ser executada no service.register
(string $name,string $namespace = null)
: Método responsável por adicionar serviços ao registro. Ele aceita dois parâmetros: "$name" e "$namespace". O parâmetro "$name" é o nome que será atribuído ao serviço registrado, enquanto o parâmetro "$namespace" é opcional e representa o valor do serviço. Esse valor pode ser o namespace de uma classe específica. Se nenhum valor for fornecido, o método utilizará automaticamente o namespace da classe de serviço atual. Essa flexibilidade permite que você faça quantos registros de serviços forem necessários dentro do método "boot". Com esse método, você pode facilmente adicionar serviços ao registro, associando um nome significativo a eles. Isso facilita a posterior recuperação dos serviços quando necessário.isPath(string $path) : Método que verifica se o parâmetro fornecido é igual ao caminho da requisição atual.
isMethod(string $method) : Método que verifica se o parâmetro fornecido é igual ao método HTTP da requisição atual.
isPrefix(string $prefix) : Método que verifica se o parâmetro fornecido é igual ao prefixo da da rota da requisição atual.
stop(string $message) : Método que realiza uma parada imediata no fluxo da aplicação. Esse metodo aceita um parâmetro que é a mesagem com a descrição do bloqueio do fluxo.
Esses métodos permitem personalizar e estender as funcionalidades do seu service de acordo com as necessidades do seu projeto.
Mais detalhes sobre o método "register"
É importante lembrar que não é necessário registrar um serviço usando o método "register" dentro do método "boot" para que ele funcione. O método "register" é específico para o registro de instâncias de classe em namespaces diferentes ou no próprio namespace da classe atual. Após o registro, os serviços registrados podem ser acessados por meio da função auxiliar "service", que retornará uma instância do serviço registrado. Veja alguns exemplos de código a seguir:
<?php
namespace App\Services;
use Kernel\Http\ServiceProvider;
class MeuService extends ServiceProvider
{
public function boot()
{
/*
Registra o serviço atual para disponibilizar
a instância dessa classe de serviços em qualquer ponto
do ciclo de vida da aplicação
*/
$this->register('meuservice');
/*
Registra um serviço de uma classe que esteja em qualquer
ponto ou namespace da aplicação
*/
$this->register('users','App\Models\UserModel');
}
/*
Método para somar dois números inteiros
*/
public function sum(int $x,int $y) : int
{
return $x + $y;
}
}
Com base no código fornecido, será possível acessar os serviços registrados em qualquer estágio do ciclo de vida da aplicação, exceto dentro do método "boot" da classe de serviço.
Route::get('teste',function(){
return service('meuservice')->sum(10,5);
//output: 15
});
Route::get('teste',function(){
return service('users')->all();
//output: array de usuários
});
Ao explorar esse conceito, fica evidente o poder dos serviços e a ampla gama de oportunidades para escalabilidade e modularidade. É notável como é viável implementá-los de maneira simples e com baixo acoplamento.
Last updated