ситуация
У меня есть контроллер, который обрабатывает редактирование страницы, например.
/**
* Update a page
* @ParamConverter("page", class="AcmeBundle:Page", options={"id" = "page_id"})
*/
public function editAction(Page $page, Request $request)
{
$form = $this->createForm(PageType::class, $page);
if ($form->handleRequest($request)->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
$this->addFlash('success', 'page_admin.flash.updated');
if ($form->get('save_and_stay')->isClicked()) {
return $this->redirect($request->headers->get('referer'));
}
else {
return $this->redirectToRoute('acme_page_admin_index');
}
}
return $this->render('AcmeBundle:PageAdmin:edit.html.twig', array(
'form' => $form->createView()
));
}
Моя форма включает две кнопки отправки, одну для сохранения страницы и возврат к индексу, один для сохранения страницы и сохранения в форме редактирования.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('headline')
->add('body')
->add('save', SubmitType::class)
->add('save_and_stay', SubmitType::class)
;
}
Вопрос
Когда форма отправлена, я просто проверяю, какая кнопка была нажата, и выполните правильное действие. Но я думаю, мне нужно сделать сервис для этого, и я точно не знаю, как это сделать. Как его назвать (acme.form.save_and_stay
?), Где его хранить (AcmeBundle\Service\SaveAndStay
?).
У меня есть некоторые трудности с тем, чтобы организовать приложение Symfony с услугами и понять, когда я должен их использовать.
Я не думаю, что вам нужна услуга. Вы можете переписать среднюю часть следующим образом:
if ($form->handleRequest($request)->isSubmitted() && $form->isValid()) {
[...]
if ($form->get('save')->isClicked()) {
return $this->redirectToRoute('acme_page_admin_index');
}
}
return $this->render('AcmeBundle:PageAdmin:edit.html.twig', array(
'form' => $form->createView()
));
Таким образом, вы должны проверить, была ли нажата кнопка для сохранения и перехода к индексу - если да, то перенаправляйтесь туда. В противном случае просто визуализируйте форму с введенными значениями.