Больше 10 вложенных форвардов?

Мой проект требует нескольких платежных шлюзов, поэтому я установил модуль для каждого платежного шлюза и привязал соответствующий платежный шлюз к учетной записи, которая его использовала. Затем я поместил весь код оплаты в соответствующий контроллер модуля. Все шлюзы реализуют один и тот же интерфейс для обеспечения существования функций.

Теперь я использую ночной 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 раз, но в будущем это будет расти, поскольку добавляются новые платежные шлюзы и больше транзакций ставятся в очередь.

Что касается решения, я ищу либо

  • отключите эту проверку для моего cron или,
  • найти альтернативу $this->forward()->dispatch(...);, которая по-прежнему позволит мне вызывать другой контроллер несколько раз с настраиваемыми параметрами.

Альтернативой является то, что я передаю все транзакции каждому соответствующему платежному шлюзу и вызываю $this->forward()->dispatch() только один раз для каждого шлюза, но я снова столкнусь с этой проблемой, когда доберусь до десяти платежных шлюзов.

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

rkeet 12.12.2018 10:25

Вот что я делаю. У меня есть цикл транзакций, каждая транзакция отправляется на платежный шлюз, который взимает со счета сумму транзакции. Это внутри блока try / catch, где исключения регистрируются и вне цикла отправляются мне по электронной почте для отладки.

Richard Parnaby-King 12.12.2018 12:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Плагин контроллера forward позволяет установить максимальное количество вложенных форвардов.

Перед циклом я установил максимальное количество вложенных переадресаций на количество элементов, которые я собирался пройти в цикле:

$this->forward()->setMaxNestedForwards(count($transactions));

Это ответ или дополнительная информация? Читается как дополнительная информация.

rkeet 12.12.2018 10:22

Это ответ. Мне нужно подождать еще день, прежде чем я смогу это принять.

Richard Parnaby-King 12.12.2018 12:15

Другие вопросы по теме