как я могу заставить symfony сохранить данные POST после страницы входа?
например, cookie истек, пока пользователь заполнял форму. после отправки формы пользователь получает перенаправление на страницу входа. и после успешного входа в систему он получает перенаправление обратно к URL-адресу «действия» формы без каких-либо данных POST из начальной формы.
есть ли какой-либо механизм в symfony для обработки этих данных, или я должен написать свой собственный?
Кстати, я использую sfGuardPlugin
Я написал для этого простой фильтр. Возможно, вы можете расширить свои возможности, и вы можете использовать, здесь
class postFilter extends sfFilter { public function execute($filterChain) { // Execute this filter only once if ($this->isFirstCall()) { // reach user object $user = $this->getContext()->getUser(); // request $request = $this->getContext()->getRequest(); // if user unauthenticated and if user posted a form if(!$user->isAuthenticated() AND $request->isMethod('post')) { // now you can save the post parameters $user->setAttribute('param_name', $request->getParameter('post_data')); // or something like that } } // Execute next filter $filterChain->execute(); } }
И добавьте фильтр в filters.yml
post_filter: class: postFilter
Я надеюсь, что это помогает.
Я почти уверен, что выполнение $ this-> forward () фактически отправляет все ваши данные.
У меня нет никаких предварительных знаний о структуре symfony, но мне кажется нормальным, что после перенаправления вы теряете эту информацию. Почтовые переменные ограничены уникальным HTTP-запросом. Выполнение перенаправления означает, как правило, выполнение второго HTTP-запроса. Вы не можете хранить переменные POST. Вместо этого вы должны использовать переменные SESSION.
Вы можете указать дополнительные параметры для перенаправления в symfony следующим образом:
$this->redirect('module/action?var='.$request->getParameter('id')); $this->redirect('module/action?var=2');
Конечно, не так уж удобно отправлять пароли, как это.
Пользовательский сеанс может быть вариантом, но попытаться сделать все, прежде чем перенаправлять на новое действие
Я думаю, что атрибут Flash был бы хорошим компромиссом для этого. В отличие от сеанса, который будет работать, значения сохраняются только на следующей странице.
http://www.symfony-project.org/book/1_2/06-Inside-the-Controller-Layer#Flash%20Attributes
foreach($_POST as $key => $value){ $this->getUser()->setFlash($key, $value); }
Атрибуты вспышки автоматически очищаются после следующего запроса.
Вам нужно будет сохранить его в $ _SESSION. убедитесь, что вы вызвали session_start (), тогда вы можете сделать что-то вроде этого:
foreach($_POST as $key => $value){ $_SESSION[$key] = $value; }
или просто сохраните его как вспомогательный массив в сеансе.
$_SESSION['previousPost'] = $_POST;
У меня нет опыта с концепцией Sympony, но это выполнит работу.