작업 단위는 몇 가지 주요 이점을 제공합니다. 모든 변경 사항이 커밋되거나 데이터 일관성을 보장합니다.
<code class="php"><?php class UnitOfWork { private $pdo; private $repositories = []; public function __construct(PDO $pdo) { $this->pdo = $pdo; } public function registerRepository(RepositoryInterface $repository) { $this->repositories[$repository->getEntityName()] = $repository; } public function beginTransaction() { $this->pdo->beginTransaction(); } public function commit() { $this->pdo->commit(); } public function rollback() { $this->pdo->rollBack(); } public function persist($entity) { $repositoryName = get_class($entity); if (!isset($this->repositories[$repositoryName])) { throw new Exception("Repository for entity '$repositoryName' not registered."); } $this->repositories[$repositoryName]->persist($entity); } public function flush() { foreach ($this->repositories as $repository) { $repository->flush(); } } public function __destruct() { if ($this->pdo->inTransaction()) { $this->rollback(); //Rollback on error or destruction } } } interface RepositoryInterface { public function getEntityName(): string; public function persist($entity); public function flush(); } //Example Repository class UserRepository implements RepositoryInterface{ private $pdo; public function __construct(PDO $pdo){ $this->pdo = $pdo; } public function getEntityName(): string{ return "User"; } public function persist($user){ //Insert or update user data into the database using PDO $stmt = $this->pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)"); $stmt->execute([$user->name, $user->email]); } public function flush(){ //Usually handled implicitly within persist() in this simplified example } } // Example Usage $pdo = new PDO('mysql:host=localhost;dbname=mydatabase', 'username', 'password'); $unitOfWork = new UnitOfWork($pdo); $userRepository = new UserRepository($pdo); $unitOfWork->registerRepository($userRepository); $unitOfWork->beginTransaction(); try{ $user = new User; // Assume User class exists $user->name = 'John Doe'; $user->email = 'john.doe@example.com'; $unitOfWork->persist($user); $unitOfWork->flush(); $unitOfWork->commit(); echo "Transaction successful!"; } catch (Exception $e){ $unitOfWork->rollback(); echo "Transaction failed: " . $e->getMessage(); } ?></code>성능 향상 :
트랜잭션 관리의 복잡성을 없애고 유지.
try...catch
특정 예외 처리 : catch
대신에 다른 오류 시나리오를 적절하게 처리하려면 특정 예외 (예 : )를 포착하는 것을 고려하십시오. 이를 통해보다 세분화 된 오류 처리 및 로깅을 허용합니다. rollback()
PDOException
블록 외부에서 예외가 발생하면 (예를 들어, 객체 파괴 중에) 예외가 계속되도록 보장합니다. PHP 애플리케이션? try...catch
위 내용은 PHP에서 거래 관리를위한 작업 단위 패턴을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!