В продолжение предыдущего поста. Прикручивая капчу к форме добавления/редактирования комментариев, обнаружил, что теряется сохраняемый в сессии параметр ‘redirect_from‘, который я использовал, чтобы вернуть пользователя обратно на страницу, откуда он приходил. Сразу вспомнился топик о потере сессий пользователями при редиректе.
Почти сутки проковырявшись с проектом, я обнаружил, что собственно без капчи все работает нормально. Судя по всему, когда браузер совершает запрос к серверу за изображением (что-то вроде http://localhost/captcha/default), все flash-данные сессии очищаются, в том числе и мой несчастный параметр. Первое пришедшее в голову решение — дописать в контроллер Captcha_Controller строчку Session::instance()->keep_flash(), которая продлевает жизнь flash-данным в сессии еще на один запрос.
Итог — надо быть аккуратнее с подобными фишками, аналогичные проблемы скорее всего ожидают и при Ajax-запросах. Возможно, стоит создать специальное событие, которое будет генерироваться при всех запросах, возвращающих не text/html результат…
Кстати для такой фичи можно еще использовать get параметр в строке запроса. Например auth\login?redirect_to=admin.
Мне не очень нравится показывать внутренние переменные в GET-строке… В крайнем случае что-то типа ?page=X, но уж не значение редиректа. А иначе — зачем нам сессии?
Как вариант, можно вместо flash-данных использовать стандартные, а после использования сразу удалять.
Session::get_once('redirect_from');
Я в данный момент заинтересовался предложенным на форуме вариантом от spirit’а, очень любопытное решение.