Sendit
Привет
У меня регулярно SENDIT выкидывает сообщение «Невалидный токен» при Авторизации или Регистрации.
modx3.1.2 + php8
ошибка в логе:
Я посоветовался c DeepSeek:
Произвел замену:
Ошибка пропала. Но осадочек сомнения остался, всё ли так?
У меня регулярно SENDIT выкидывает сообщение «Невалидный токен» при Авторизации или Регистрации.
modx3.1.2 + php8
ошибка в логе:
[2025-12-15 17:34:17] (ERROR @ ***** core/components/sendit/services/sendit.class.php: 1316) PHP warning: Undefined array key «siSession»блок кода с ошибкой:
$sessionId = $sessionId ?: $_COOKIE['siSession'];
if (!$session = $modx->getObject('siSession', ['session_id' => $sessionId, 'class_name' => $className])) {
return [];
} Я посоветовался c DeepSeek:
Ошибка возникает из-за того, что в PHP 8 стало строже обращение к несуществующим ключам массива. Нужно добавить проверку перед использованием $_COOKIE['siSession'].
Альтернативный подход — если кука не обязательна, можно создать новую сессию
Произвел замену:
// $sessionId = $sessionId ?: $_COOKIE['siSession'];
$sessionId = $sessionId ?: ($_COOKIE['siSession'] ?? null);
if (empty($sessionId)) {
// Создаем новую сессию
$session = $modx->newObject('siSession');
$session->set('session_id', uniqid('si_', true));
$session->set('class_name', $className);
$session->set('createdon', time());
$session->save();
// Устанавливаем куку
setcookie('siSession', $session->get('session_id'), time() + 86400, '/');
return $session->toArray();
}
if (!$session = $modx->getObject('siSession', ['session_id' => $sessionId, 'class_name' => $className])) {
return [];
} Ошибка пропала. Но осадочек сомнения остался, всё ли так?
Комментарии: 2
Привет Григорий.
Осадочек обоснованный — решение рабочее, но есть несколько моментов, которые стоит обдумать:
Что смущает в текущем фиксе
1. Изменение логики метода.
Оригинальный код при отсутствии сессии возвращал []. Теперь он создаёт сессию. Это может сломать логику в других местах SendIt, которые рассчитывают на пустой ответ как сигнал «сессии нет, нужно что-то сделать».
2. setcookie() без проверки заголовков
Если заголовки уже отправлены — будет ещё один warning.
Минимальный и безопасный фикс
Если цель — просто убрать warning без изменения логики:
Что бы я сделал
Посмотрел бы, где в SendIt сессия создаётся штатно. Скорее всего есть отдельный метод типа createSession() или это происходит при первой отправке формы. Вот там и должна быть логика создания + установки куки.
Твой фикс работает, но ты фактически добавил fallback-создание сессии в метод, который был рассчитан только на чтение. Если форма авторизации/регистрации работает корректно — можно оставить, но я бы откатился к минимальному варианту и понаблюдал.
Осадочек обоснованный — решение рабочее, но есть несколько моментов, которые стоит обдумать:
Что смущает в текущем фиксе
1. Изменение логики метода.
Оригинальный код при отсутствии сессии возвращал []. Теперь он создаёт сессию. Это может сломать логику в других местах SendIt, которые рассчитывают на пустой ответ как сигнал «сессии нет, нужно что-то сделать».
2. setcookie() без проверки заголовков
Если заголовки уже отправлены — будет ещё один warning.
Минимальный и безопасный фикс
Если цель — просто убрать warning без изменения логики:
$sessionId = $sessionId ?: ($_COOKIE['siSession'] ?? null);
if (!$sessionId || !$session = $modx->getObject('siSession', ['session_id' => $sessionId, 'class_name' => $className])) {
return [];
}Это сохраняет оригинальное поведение: нет куки → нет сессии → пустой массив. Создание сессии должно происходить там, где это предусмотрено архитектурой компонента.Что бы я сделал
Посмотрел бы, где в SendIt сессия создаётся штатно. Скорее всего есть отдельный метод типа createSession() или это происходит при первой отправке формы. Вот там и должна быть логика создания + установки куки.
Твой фикс работает, но ты фактически добавил fallback-создание сессии в метод, который был рассчитан только на чтение. Если форма авторизации/регистрации работает корректно — можно оставить, но я бы откатился к минимальному варианту и понаблюдал.
Так и сделаю. Спасибо!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.