O segundo conceito básico para um bom aproveitamento do zend framework 2 é o service manager.
O service manager é uma classe que usamos para instanciar outras classes dentro de um módulo. O motivo disso é evitar o acoplamento (instanciar classes dentro de outras classes) pois quando o service manager instancia uma classe, ele guarda o registro dela na memória assim instanciando essa classe em toda aplicação somente uma vez.
Existem algumas formas de usar o service manager no zend framework 2, mas o modo básico é no arquivo Module.php localizado na root da pasta do seu módulo.
Iremos criar o método da seguinte forma:
public function getServiceConfig(){
return array(
'factories' => array(
'Usuario\Service\UsuarioService' => function(){
return new UsuarioService();
}
)
);
}
getServiceConfig => o método deve ter esse nome para ser reconhecido.
factories => iremos usar esse conceito, existem outros como por exemplo invokables.
Usuario\Service\UsuarioService => é o nome do nosso serviço. Por boas práticas é recomendável que o nome seja o caminho da classe para evitar duplicidades.
Como eu disse acima a principal função do service manager é evitar o acoplamento. Segue um exemplo dessa situação:
public function getServiceConfig(){
return array(
'factories' => array(
'Usuario\Service\UsuarioService' => function($serviceManager){
$entityManager = $serviceManager->get('Doctrine\ORM\EntityManager');
return new UsuarioService($entityManager);
}
)
);
}
$serviceManager => por padrão nosso método getServiceConfig recebe por parâmetro a instancia do serviceManager.
$serviceManager->get => com o método get nós localizamos e instanciamos uma classe do sistema.
UsuarioService($entityManager) => então podemos passar a instancia por parâmetro para nossa classe de serviços.
Na classe controller dentro de um módulo chamamos um serviço da seguinte forma:
public function insert(){
$usuarioService = $this->serviceLocator()->get('Usuario\Service\UsuarioService');
$usuarioService->insertData(array('usuario_nome'=>'Teste'));
}
$this->serviceLocator()->get() => é dessa forma que iremos localizar e instanciar qualquer serviço registrado no getServiceConfig().
$usuarioService => uma vez instanciado é só chamar um método que pertença a ele.
Na classe do serviço devemos nos atentar a um detalhe muito importante. Se passamos um parâmetro assim que instanciamos a classe no getServiceConfig esse parâmetro deve ser recuperado dentro do método mágico __construct().
Segue um exemplo de uma classe service:
<?php
namespace Usuario\Service
use 'Doctrine\ORM\EntityManager';
class UsuarioService{
private $em;
public function __construct(EntityManager $entityManager){
$this->em = $entityManager;
}
public function insert(Array $data){
$obj = $this->arrayToObject($data);
$this->em->persist($obj);
return $this->em->flush();
}
EntityManager => recebemos a instancia da classe por parâmetro.
$this->em => criamos uma variável para guardar a instancia da classe e então podemos usa-la em qualquer método que desejamos.
Mais informações:
http://framework.zend.com/manual/current/en/modules/zend.service-manager.quick-start.html
Nenhum comentário:
Postar um comentário