<?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(); } ?>
try...catch
ブロック内でラップします。 例外が発生した場合、catch
ブロックは、unitofworkのrollback()
メソッドを呼び出す必要があります。catch (Exception $e)
の代わりに、異なるエラーシナリオを適切に処理するために、特定の例外(例えば、PDOException
)をキャッチすることを検討してください。 これにより、より詳細なエラーの処理とロギングが可能になります。try...catch
以上がPHPでのトランザクション管理のための作業パターンの単位を実装する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。