В Symfony существует несколько способов реализации функциональности, аналогичной методу Redirect::back()->withErrors()
в Laravel.
Один из способов - использование класса SymfonyComponentHttpFoundationRedirectResponse
. Этот класс предоставляет возможность создания HTTP-ответа с кодом перенаправления (302) и установкой заголовка Location
на предыдущую страницу.
Для передачи ошибок между запросами можно использовать класс SymfonyComponentHttpFoundationSessionSession
. Этот класс предоставляет возможность сохранения данных между запросами в сессии. В данном случае можно сохранить ошибки в сессии перед перенаправлением на предыдущую страницу, а затем получить их на следующем запросе.
Пример использования RedirectResponse и Session:
use SymfonyComponentHttpFoundationRedirectResponse; use SymfonyComponentHttpFoundationSessionSession; use SymfonyComponentHttpFoundationSessionFlashFlashBagInterface; // в контроллере после валидации формы // создаем объект сессии $session = new Session(); $session->start(); // сохраняем ошибки в сессии $errors = [ 'error1' => 'Ошибка 1', 'error2' => 'Ошибка 2', ]; $session->getFlashBag()->add('errors', $errors); // создаем объект RedirectResponse для перенаправления на предыдущую страницу $redirectUrl = $request->headers->get('referer'); $response = new RedirectResponse($redirectUrl); // возвращаем ответ с перенаправлением return $response;
Затем, на странице предыдущего запроса, можно получить сохраненные ошибки из сессии и отобразить их пользователю:
use SymfonyComponentHttpFoundationSessionSession; use SymfonyComponentHttpFoundationSessionFlashFlashBagInterface; // в контроллере для предыдущей страницы // создаем объект сессии $session = new Session(); $session->start(); // получаем ошибки из сессии $errors = $session->getFlashBag()->get('errors'); // отображаем ошибки foreach ($errors as $errorKey => $errorMessage) { echo $errorKey . ': ' . $errorMessage . '<br>'; }
Кроме того, в Symfony можно использовать компонент SymfonyComponentHttpFoundationRequestStack
, чтобы получить объект Request
текущего запроса и его предыдущий адрес (referer). Это позволит вам получать referer без необходимости явно передавать его в контроллер.