我使用Symfony 2.3和PHP Doctrine 2。
程序有以下模型:
- entity Order - a typical customer order
- entity BadOrderEntry(fields: id, order - unidirectional one-to-one relationship with Order, createdAt)
- factory BadOrderEntryFactory for creation entity BadOrderEntry
- repository BadOrderEntryRepository for search methods of entity BadOrderEntry
- manager BadOrderEntryManager for save/edit/delete methods of entity BadOrderEntry
AND MAIN CLASS BadOrderList - list of bad orders, code of this class:
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); } }
我很喜欢这个类的设计。我认真思考了很多。一切都很棒。但是!有一个问题:在add和remove方法中的操作必须在事务中执行。
在PHP Doctrine 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类中隐藏事务机制的依赖关系?
Manager::add
和delete
添加事务管理,我建议您重新考虑您的设计。它不太好看。使您的模型具有持久性独立性。 - Ziumin