내가 심포니 2.3과 PHP의 교리 프로그램은 다음과 같은 모델이 2분리 비즈니스 로직 PHP 교리 2
사용에서 :
- 단체 주문 - 일반 고객 주문
- 엔티티 BadOrderEntry을 (필드 : ID, 순서 - 주문과 단방향 일대일 관계, createdAt) 생성 엔티티 BadOrderEntry
- 저장소 BadOrderEntryReposi에 대한
- 공장 BadOrderEntryFactory
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); } }
및 메인 클래스 BadOrderList을/편집/저장 엔티티의 방법을 삭제
나는이 클래스의 디자인이 정말 마음에 듭니다. 나는 그것에 대해 많이 생각했다. 모든 것이 훌륭합니다. 그러나! 한 가지 문제가 있습니다. 메소드에서 추가 및 제거 작업을 트랜잭션에서 수행해야합니다. 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 클래스의 트랜잭션 메커니즘에 대한 의존성을 숨기는 방법은 무엇입니까?
이 delete'I은 또한 당신이 다시 생각하는 것이 좋습니다'당신'관리자 : add'에 트랜잭션 관리를 추가하고
그리고 당신은 당신의 BadOrderEntryList에 ORMBadOrderEntryManager를 주입 것이다 당신의 디자인. 정말 좋지 않아. 모델을 독립적으로 유지하십시오. – Ziumin
@ Ziumin Manager에 트랜잭션 관리를 추가하려면 어떻게해야합니까 :: 추가 (삭제)합니까? 어떤 디자인 문제입니까? 관리자는 단순히 교리 객체 관리자에 대한 추상화의 추가 계층입니다. 나쁘지도 않고 좋지도 않습니다. 그러나 더 많은 통제력을 제공합니다. – stalxed
예제에서 언급 한 것과 같은 방법으로이를 수행 할 수 있습니다. http://doctrine-orm.readthedocs.org/en/latest/reference/transactions-and-concurrency.html#approach-2-explicitly. 디자인 문제 - 왜 당신의 목록이 MAIN 객체라고 생각하십니까? 당신의 건축의 주요 부분은 무엇입니까? 방법과 클래스 이름에 대해 생각해 보셨습니까? 교리없이 모델 전체를 테스트해볼 수 있습니까? – Ziumin