Ответ Symfony 2 - Layout embed "no entity/class form" validation isn't working является 100% правильно, но мы используем контексты и изолировать их, таким образом действие, которое всегда использует запрос мастер будет нарушать правила. У вас есть все запросы (один мастер и ноль или более подзапросов) в request_stack
. Инъекция Request $request
в действие вашего контроллера - это текущий запрос, который является подзапросом только с max=3
(ввод значения Request
сейчас не рекомендуется). Таким образом, вы должны использовать «правильный» запрос.
Выполнение перенаправления может быть выполнено разными способами, например, вернуть код сценария JS для перенаправления (что довольно уродливо imho). Я бы не использовал подзапросы из ветки, потому что слишком поздно, чтобы начать перенаправление, но сделайте подзапрос в действии. Я не тестировал код, но он должен работать. Controller::forward
- ваш друг, так как он дублирует текущий запрос на выполнение подзапроса.
Controller.php (просто чтобы увидеть реализацию).
/**
* Forwards the request to another controller.
*
* @param string $controller The controller name (a string like BlogBundle:Post:index)
* @param array $path An array of path parameters
* @param array $query An array of query parameters
*
* @return Response A Response instance
*/
protected function forward($controller, array $path = array(), array $query = array())
{
$path['_controller'] = $controller;
$subRequest = $this->container->get('request_stack')->getCurrentRequest()->duplicate($query, null, $path);
return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
}
YourController.php
public function pageAction() {
$formResponse = $this->forward('...:...:form'); // e.g. formAction()
if($formResponse->isRedirection()) {
return $formResponse; // just the redirection, no content
}
$this->render('...:...:your.html.twig', [
'form_response' => $formResponse
]);
}
public function formAction() {
$requestStack = $this->get('request_stack');
/* @var $requestStack RequestStack */
$masterRequest = $requestStack->getCurrentRequest();
\assert(!\is_null($masterRequest));
$form = ...;
$form->handleRequest($masterRequest);
if($form->isValid()) {
return $this->redirect(...); // success
}
return $this->render('...:...:form.html.twig', [
'form' => $form->createView()
]);
}
your.html.twig
{{ form_response.content | raw }}
Эй крестцовой, спасибо за ваш подробный ответ и пример кода! Я сделал все, как вы сказали, и отрисовал 'pageAction' на моем базовом шаблоне. Теперь im получает эту ошибку: Переменная «форма» не существует в ControllerViews/Renders/form.html.twig в строке 1 – user264593
, как вы можете видеть из 'formAction', мы передаем' form' в 'render()' и вы можете использовать его в 'form.html.twig'. В 'your.html.twig' в' pageAction' вы передаете 'form_response', который является HTML, и вы можете просто использовать его в twig. Пожалуйста, дважды проверьте, нет ли переменной 'form' в' your.html.twig' и просто попытайтесь понять, что происходит в действиях контроллера, чтобы найти проблему. – Aitch
Хорошо, я нашел проблему. В pageAction я отобразил form.html.twig вместо your.html.twig. Теперь я получаю форму, но она все еще не работает. Я думаю, что это все еще проблема с запросом, потому что после отправки формы URL-адрес изменяется следующим образом:>? Form [search] = Test & form [category] = & form [type] = & form [location] = & form [send] = & form [_token] = nQCbivIi7IppDpaWtmEesLOOVEoPL7njJCPpXPlxxPg – user264593