Этот код работает отлично:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
abstract class TableManagerController extends Controller
{
public function listAndAddAction(Request $request)
{
// We get the Entity Manager
$entityManager = $this->getDoctrine()->getManager();
// We get the entity repository
$repository = $entityManager->getRepository($this->entityRepository);
// We build the new form through Form Factory service
$form = $this->get('form.factory')->create($this->entityFormObject, $this->entityObject);
// If user sent the form and sent data is valid
if ($form->handleRequest($request)->isValid())
{
// We set the position of the new entity to the higher existing one + 1
$newPosition = $repository->higherPosition() + 1;
$this->entityObject->setPosition($newPosition);
// We insert the data in DB
$entityManager->persist($this->entityObject);
$entityManager->flush();
// We redirect user to the defined homepage
return $this->redirect($this->generateUrl($this->routeHomePage));
}
return $this->render($this->renderIndexTemplate, array(
'dataList' => $repository->listAll(),
'form' => $form->createView()
));
}
}
Но когда я просто разделил его на 3 метода, вот так:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
abstract class TableManagerController extends Controller
{
public function listAndAddAction(Request $request)
{
$dataList = $this->listMethod();
$form = $this->addMethod($request);
return $this->render($this->renderIndexTemplate, array(
'dataList' => $dataList,
'form' => $form
));
}
protected function listMethod()
{
// We get the Entity Manager
$entityManager = $this->getDoctrine()->getManager();
// We get the entity repository
$repository = $entityManager->getRepository($this->entityRepository);
// We generate the entity management homepage view (list + add form)
return $repository->listAll();
}
protected function addMethod(Request $request)
{
// We get the Entity Manager
$entityManager = $this->getDoctrine()->getManager();
// We get the entity repository
$repository = $entityManager->getRepository($this->entityRepository);
// We build the new form through Form Factory service
$form = $this->get('form.factory')->create($this->entityFormObject, $this->entityObject);
// If user sent the form and sent data is valid
if ($form->handleRequest($request)->isValid())
{
// We set the position of the new entity to the higher existing one + 1
$newPosition = $repository->higherPosition() + 1;
$this->entityObject->setPosition($newPosition);
// We insert the data in DB
$entityManager->persist($this->entityObject);
$entityManager->flush();
// We redirect user to the defined homepage
return $this->redirect($this->generateUrl($this->routeHomePage));
}
// We return the generated form
return $form->createView();
}
}
Я получаю эту ошибку, которая появляется после отправки формы:
An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Argument 1 passed to Symfony\Component\Form\FormRenderer::renderBlock() must be an instance of Symfony\Component\Form\FormView, instance of Symfony\Component\HttpFoundation\RedirectResponse given, called in D:\Websites\CPG-2015\app\cache\dev\twig\d6\80\0e5eee6c7aa1859cedb4cd0cc7317a0ebbdd61af7e80f217ce1d2cf86771.php on line 61 and defined in D:\Websites\CPG-2015\vendor\symfony\symfony\src\Symfony\Component\Form\FormRenderer.php line 106") in IBCPGAdministrationBundle:CourseLevel:index.html.twig at line 19.
для которого я понимаю, что с формой что-то не так. Но я действительно не понимаю, почему, так как эта же форма, с той же точки зрения, выглядит отлично, прежде чем я отправлю ее.
Проблема здесь в вашем addMethod
:
// We redirect user to the defined homepage
return $this->redirect($this->generateUrl($this->routeHomePage));
который, в свою очередь, используется здесь без какой-либо обработки этой возможности return
:
$form = $this->addMethod($request);
return $this->render($this->renderIndexTemplate, array(
'dataList' => $dataList,
'form' => $form
));
Возвращая $this->redirect
внутри if-оператора, вы даете два потенциальных возвращаемых значения addMethod
, FormView
или RedirectResponse
. В результате вы затем пытаетесь передать этот RedirectResponse
через form
которую Twig пытается отобразить (чего, конечно, не может).
Решение состоит в том, чтобы переработать свою логику возврата!