我使用symfony的2.3和PHP學說2.分離業務邏輯從PHP學說2
該方案具有以下型號:
- 實體訂單 - 一個典型的客戶訂單
- 實體BadOrderEntry(場:id,訂單 - 與訂單的單向一對一關係,createdAt)
- 工廠BadOrderEntryFactory用於創建實體BadOrderEntry
- 存儲庫BadOrderEntryReposi保守黨對實體的搜索方法BadOrderEntry
- 經理BadOrderEntryManager用於保存/編輯/刪除實體的方法BadOrderEntry
和主類BadOrderList - 壞的訂單列表中,這個類的代碼:
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); } }
我很喜歡這門課的設計。我想了很多。 一切都很美妙。但!有一個問題:必須在事務中執行方法添加和刪除操作。在PHP Docrine 2
事務代碼看起來是這樣的:
<?php
$em->getConnection()->beginTransaction();
try {
//... do some work
$em->getConnection()->commit();
} catch (Exception $e) {
$em->getConnection()->rollback();
throw $e;
}
但我怎麼能叫內BadOrderList這個代碼?
我花了很多時間和取決於數據庫(和相應的PHP Doctrine 2),並再次創建它? 現在依賴關係被隱藏在類BadOrderEntryRepository和BadOrderEntryManager中。
如何在類BadOrderList中隱藏對事務機制的依賴?
添加事務管理你的'經理:: add'和'delete'I也建議你重新考慮你的設計。這不是很好。讓你的模型持久獨立。 – Ziumin 2015-01-04 14:37:51
@Ziumin如何將事務管理添加到Manager :: add(或刪除)?什麼設計問題?經理對於學科對象管理器只是一個額外的抽象層。這並不壞,它不好。但提供更多控制權。 – stalxed 2015-01-04 14:52:04
您可以按照您在示例中提到的相同方式進行操作。 http://doctrine-orm.readthedocs.org/en/latest/reference/transactions-and-concurrency.html#approach-2-explicitly。至於設計問題 - 爲什麼你認爲你的清單是主要對象。主要是你的建築部分?你有沒有想過方法和類名?你能否在沒有教條的情況下測試整個模型? – Ziumin 2015-01-04 15:28:54