Мой проект требует нескольких платежных шлюзов, поэтому я установил модуль для каждого платежного шлюза и привязал соответствующий платежный шлюз к учетной записи, которая его использовала. Затем я поместил весь код оплаты в соответствующий контроллер модуля. Все шлюзы реализуют один и тот же интерфейс для обеспечения существования функций.
Теперь я использую ночной cron для списания платежей с каждой учетной записи. Проблема, которую я получаю, заключается в том, что для запуска соответствующего контроллера я использую следующий код внутри цикла foreach:
$response = $this->forward()->dispatch(sprintf('PaymentGateway\%s\Controller\Index', ucwords($pg->code)), $params);
где $pg->code - платежный шлюз, назначенный учетной записи.
На данный момент у меня есть два платежных шлюза (в ближайшем будущем они появятся), каждый из которых должен обработать около 20 тестовых платежей. Когда я запускаю команду cron, я получаю сообщение об ошибке:
Circular forwarding detected: greater than 10 nested forwards
В этом сценарии мне нужно, чтобы он запускался 40 раз, но в будущем это будет расти, поскольку добавляются новые платежные шлюзы и больше транзакций ставятся в очередь.
Что касается решения, я ищу либо
$this->forward()->dispatch(...);, которая по-прежнему позволит мне вызывать другой контроллер несколько раз с настраиваемыми параметрами.Альтернативой является то, что я передаю все транзакции каждому соответствующему платежному шлюзу и вызываю $this->forward()->dispatch() только один раз для каждого шлюза, но я снова столкнусь с этой проблемой, когда доберусь до десяти платежных шлюзов.
Вот что я делаю. У меня есть цикл транзакций, каждая транзакция отправляется на платежный шлюз, который взимает со счета сумму транзакции. Это внутри блока try / catch, где исключения регистрируются и вне цикла отправляются мне по электронной почте для отладки.






Плагин контроллера forward позволяет установить максимальное количество вложенных форвардов.
Перед циклом я установил максимальное количество вложенных переадресаций на количество элементов, которые я собирался пройти в цикле:
$this->forward()->setMaxNestedForwards(count($transactions));
Это ответ или дополнительная информация? Читается как дополнительная информация.
Это ответ. Мне нужно подождать еще день, прежде чем я смогу это принять.
Почему у вас есть отправка транзакции для отправки следующей транзакции? Это кажется совершенно нелогичным. Почему вы не зацикливаете транзакции, которые нужно выполнить? В этом цикле вы отправляете транзакцию в пределах try / catch, чтобы гарантировать, что цикл продолжается, даже если одна транзакция не удалась. Еще лучше было бы сделать такую вещь многопоточной (см. php.net/manual/en/book.pthreads.php, sitepoint.com/parallel-programming-pthreads-php-fundamentals (глава Повторное использование потоков))