Io uso symfony 2.3 e php dottrina 2.logica di business separazione da PHP Doctrine 2
Il programma ha i seguenti modelli:
- entità Order - un tipico ordine del cliente
- entità BadOrderEntry (campi : id, ordine - relazione one-to-one unidirezionale con Order, createdAt)
- factory BadOrderEntryFactory per l'entità di creazione BadOrderEntry
- repository BadOrderEntryReposi tory per i metodi di ricerca di soggetti BadOrderEntry
- responsabile BadOrderEntryManager per salvare/modificare/cancellare i metodi di soggetti BadOrderEntry
E PRINCIPALI CLASSE BadOrderList - elenco degli ordini cattivi, il codice di questa classe:
private $factory; private $repository; private $manager; public function __construct( BadOrderEntryFactory $f, BadOrderEntryRepository $r, BadOrderEntryManager $m ) { $this->factory = $f; $this->repository = $r; $this->manager = $m; } public function has(Order $order) { return $this->repository->existsByOrder($order); } public function add(Order $order) { if (! $this->has($order)) { $entry = $this->factory->create($order); $this->manager->save($entry); } } public function remove(Order $order) { $entry = $this->repository->findOneByOrder($order); if ($entry !== null) { $this->manager->delete($entry); } }
Mi piace molto il design di questa classe. Ci ho pensato molto. Tutto è meraviglioso. MA! C'è un problema: le operazioni nei metodi add e remove devono essere eseguite nelle transazioni.
Codice transazione in PHP Docrine 2 si presenta così:
<?php
$em->getConnection()->beginTransaction();
try {
//... do some work
$em->getConnection()->commit();
} catch (Exception $e) {
$em->getConnection()->rollback();
throw $e;
}
Ma come posso chiamare questo codice all'interno BadOrderList?
Ho dedicato molto tempo e rimosso a seconda del database (e di conseguenza di PHP Doctrine 2), e di nuovo per crearlo? Ora la dipendenza è nascosta nelle classi BadOrderEntryRepository e BadOrderEntryManager.
Come nascondere la dipendenza dal meccanismo di transazione nella classe BadOrderList?
aggiungere la gestione delle transazioni per il vostro 'Gestione :: add' e' delete'I suggerire anche di ripensare il vostro design. Non è davvero bello. Rendi il tuo modello persistente indipendente. – Ziumin
@Ziumin Come posso aggiungere la gestione delle transazioni a Manager :: add (o delete)? Quali problemi di progettazione? Manager è semplicemente un ulteriore livello di astrazione su doctrine object manager. Non è male e non va bene. Ma dà più controllo. – stalxed
Puoi farlo nello stesso modo in cui hai citato nel tuo esempio. http://doctrine-orm.readthedocs.org/en/latest/reference/transactions-and-concurrency.html#approach-2-explicitly. Per quanto riguarda i problemi di progettazione, perché pensi che la tua lista sia l'oggetto principale. Principale per quale parte della tua architettura? Hai pensato a metodi e nomi di classe? Puoi testare tutto il tuo modello senza la dottrina? – Ziumin