Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Transações em repositórios

Fala Mestre,

Você citou sobre esse detalhe das transações não serem responsabilidades do repositório. Se estivéssemos implementando com o doctrine esse repositório e, por exemplo, no método de adicionar eu chamar o entityManager->flush() estaria cometendo o mesmo equívoco ou posso usar o flush sem medo de ser feliz diretamente do repositorio? Lembro de já ter lido que o flush realiza uma transação implicita via a unidade de trabalho do doctrine ou algo do gênero.

2 respostas
solução!

Fala, Diego!

O método flush commita a transação. Todas as instruções antes do flush estão armazenadas mas ainda não foram enviadas pro banco.

O controle de transações normalmente é feito fora do repositório, então o ideal seria chamar o flush depois do repositório ter finalizado seu trabalho.

Eu estava fazendo alguns testes de serviços transacionais há algum tempo. Vê se esses exemplos do meu GitHub te dão um norte:

Aí no final eu faria algo do tipo:

$repository = // Doctrine ou Pdo repository
$session = // Doctrine ou Pdo session
$command = // AddQuestionCommand com os dados necessários

$addQuestion = new AddQuestion($repository, new QuestionFactory());
$addQuestionWithinTransaction = new TransactionalApplicationService($addQuestion, $session);

$addQuestionWithinTransaction->executeAtomically($command);

A implementação pode ser melhorada. Esse projeto eu fiz só pra testar algumas possibilidades. Mas dá pra tirar algumas ideias daí. Eu coloquei os arquivos numa ordem que você precisaria pra entender, mas pode ver todos os códigos do repositório se quiser entender mais a fundo...

Show de bola, mestre.

Olharei com calma mais tarde, mas batendo o olho acho que peguei a idéia. Você criou uma interface para que cada tipo de implementação automatize a realização das transações nos serviços, no TransactionalApplicationService injeta o serviço e a transação e ela (a transação) saberá como operar em cima do serviço.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software