/** * @param CreditCardTransaction $transaction */ protected function processCreditCardTransaction(CreditCardTransaction $transaction) { $type = $transaction->getType(); $method = $transaction->getMethod(); switch ($type) { case CreditCardTransaction::TYPE_AUTH: if (null !== $transaction->getId()) { throw new Exception('Invalid transaction'); } // Persist pending transaction $this->em->persist($transaction); $this->em->flush(); // Transaction processing $processor = $this->getProcessor($method); $processor->capture($transaction); break; case CreditCardTransaction::TYPE_PREAUTH: case CreditCardTransaction::TYPE_FULFILL: case CreditCardTransaction::TYPE_VOID: case CreditCardTransaction::TYPE_CANCEL: default: throw new Exception(sprintf('Unhandled transaction type "%s"', $type)); } }