tôi sử dụng symfony 2.3 và php thuyết 2.Tách logic kinh doanh từ PHP Học thuyết 2
Chương trình có các mô hình sau:
- thể Order - một đơn đặt hàng tiêu biểu
- thực thể BadOrderEntry (trường : id, order - unidirectional mối quan hệ một-một với Order, createdAt)
- nhà máy BadOrderEntryNhà máy sản xuất cho thực thể sáng tạo BadOrderEntry
- kho chứa BadOrderEntryReposi Tory cho phương pháp tìm kiếm thực thể BadOrderEntry
- quản lý BadOrderEntryManager cho lưu/chỉnh sửa/xóa các phương pháp của tổ chức BadOrderEntry
VÀ CHỦ CLASS BadOrderList - danh sách các đơn đặt hàng xấu, mã của lớp này:
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); } }
Tôi thực sự thích thiết kế của lớp này. Tôi nghĩ rất nhiều về nó. Mọi thứ đều tuyệt vời. NHƯNG! Có một vấn đề: hoạt động trong các phương thức thêm và xóa phải được thực hiện trong các giao dịch.
đang giao dịch trong PHP Docrine 2 trông như thế này:
<?php
$em->getConnection()->beginTransaction();
try {
//... do some work
$em->getConnection()->commit();
} catch (Exception $e) {
$em->getConnection()->rollback();
throw $e;
}
Nhưng làm thế nào tôi có thể gọi mã này bên BadOrderList?
Tôi đã dành rất nhiều thời gian và bị xóa tùy thuộc vào cơ sở dữ liệu (và tương ứng với PHP Doctrine 2), và một lần nữa để tạo nó? Hiện tại, sự phụ thuộc được ẩn trong các lớp BadOrderEntryRepository và BadOrderEntryManager.
Làm cách nào để ẩn phụ thuộc vào cơ chế giao dịch trong lớp BadOrderList?
Thêm quản lý giao dịch của bạn 'quản lý :: add' và 'delete'I cũng khuyên bạn nên suy nghĩ lại bạn thiết kế. Nó không thực sự tốt đẹp. Làm cho mô hình của bạn liên tục độc lập. – Ziumin
@Ziumin Làm cách nào để thêm quản lý giao dịch vào Trình quản lý :: thêm (hoặc xóa)? Vấn đề thiết kế gì? Trình quản lý chỉ đơn giản là lớp trừu tượng bổ sung trên trình quản lý đối tượng doctrine. Nó không tệ và nó không tốt. Nhưng kiểm soát nhiều hơn. – stalxed
Bạn có thể thực hiện theo cách tương tự như bạn đã đề cập trong ví dụ của mình. http://doctrine-orm.readthedocs.org/en/latest/reference/transactions-and-concurrency.html#approach-2-explicitly. Đối với vấn đề thiết kế - tại sao bạn nghĩ danh sách của bạn là đối tượng CHÍNH. Chính cho những gì một phần của bạn kiến trúc? Bạn đã nghĩ về phương pháp và tên lớp? Bạn có thể kiểm tra toàn bộ mô hình của mình mà không có học thuyết không? – Ziumin