Объект request. Формирование данных для вставки
Использую на проекте либу symfony/http-foundation.
Есть большая веб-форма для заполнения данными.

Заполненные данные надо писать в базу, а затем в этой же форме отображать, если есть данные по идентификатору.
В этой связи моих скилов хватило на следующее:
В этом методе я ловлю request, выдергиваю из него нужные мне данные. После этого формирую общий массив ключей. И на его основе итоговый общий массив, который в итоге уйдет на insert.
public function createArrayData() : array
{
$data = [];
$request = $this->request->request->all();
$reasons = $this->request->request->get('reason');
$comments = $this->request->request->get('comment');
$actions = $this->request->request->get('action');
$responsible_groups = $this->request->request->get('responsible_group');
$responsibles = $this->request->request->get('responsible');
$deadlines = $this->request->request->get('deadline');
$bsKeys = array_merge($reasons, $comments, $actions, $responsible_groups, $responsibles, $deadlines);
foreach ($bsKeys as $bsKey => $bsVal) {
$keyBranchBsStandard = explode('_', $bsKey);
$branch = $keyBranchBsStandard[0];
$bs = $keyBranchBsStandard[1];
$standard = $keyBranchBsStandard[2];
$data[$bsKey]['date'] = $this->period;
$data[$bsKey]['user_id'] = $this->user_id;
$data[$bsKey]['branch'] = $branch;
$data[$bsKey]['nri_bs_number'] = $bs;
$data[$bsKey]['standard_type'] = $standard;
$data[$bsKey]['reason'] = $reasons[$bsKey] ?? null;
$data[$bsKey]['text'] = $comments[$bsKey] ?? null;
$data[$bsKey]['action'] = $actions[$bsKey] ?? null;
$data[$bsKey]['responsible_group'] = $responsible_groups[$bsKey] ?? null;
$data[$bsKey]['responsible'] = $responsibles[$bsKey] ?? null;
$data[$bsKey]['deadline'] = $deadlines[$bsKey] ?? null;
$data[$bsKey]['comment_date'] = date('Y-m-d H:i:s');
if (
($data[$bsKey]['reason'] == null) and
($data[$bsKey]['text'] == null) and
($data[$bsKey]['action'] == null) and
($data[$bsKey]['responsible_group'] == null) and
($data[$bsKey]['responsible'] == null) and
($data[$bsKey]['deadline'] == null)
)
unset ($data[$bsKey]);
}
return $data;
}
Как сказал выше, в форме у меня отображаются ранее внесенные данные и только что внесенные.
По итогу я пишу в базу все вместе и старое и новое. Это выглядит убого с точки зрения архитектуры, но до большего я не допер.
Все работало до того момента, пока строк в форме не стало слишком много. И сейчас у меня просто выпадают данные. То есть данные которые вношу в форму отсутствуют в request.
Надеюсь поможете советом! Спасибо заранее
Ответы (1 шт):
Вы упёрлись в лимит по количеству входящих переменных max-input-vars.
Скорее всего это значение стоит по умолчанию и равно 1000. Если в форме в одной строке 5 полей, то в запросе придёт 200 строк (5 * 200 = 1000).
Если входных переменных больше, чем задано директивой, выбрасывается предупреждение
E_WARNING, а все последующие переменные в запросе игнорируются.
Можно увеличить это значение, но учитывайте, что чем больше значение, тем выше вероятность хеш-коллизий. (т.е. значение какой-либо колонки может внезапно исчезнуть из своего места и заменить значение другой колонки другой строки).
Могу предложить несколько вариантов решения:
- Постраничный вывод (она же пагинация). Выводите по несколько строк + в конце таблицы несколько пустых строк для добавления записей.
- Постраничный вывод + отдельная страница для добавления записей.
- Редактировать данные построчно. Каждая строка имееет кнопочку
сохранить. - Использовать для отправки данных
javascript, методPOSTи тип содержимого (Content-Type)application/json(тогда в лимит количества входящих переменных не упрётесь, но можете упереться в лимит размера запроса и хэш-коллизии при парсинге JSON) - При изменении содержимого ячейки автоматически ajax-запросом посылать новое значение на сервер, добавление строки - в модальном окне с формой для строки.
Я бы комбинировал последний вариант и пагинацию.