Symfony, создайте форму ввода сервиса «сохрани и останься»

1

ситуация

У меня есть контроллер, который обрабатывает редактирование страницы, например.

/**
 * 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 с услугами и понять, когда я должен их использовать.

Теги:

1 ответ

1
Лучший ответ

Я не думаю, что вам нужна услуга. Вы можете переписать среднюю часть следующим образом:

    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()
    ));

Таким образом, вы должны проверить, была ли нажата кнопка для сохранения и перехода к индексу - если да, то перенаправляйтесь туда. В противном случае просто визуализируйте форму с введенными значениями.

  • 0
    Я думал, что пользователь сможет повторно отправить форму с помощью F5, но Symfony достаточно умен, чтобы предотвратить это, отлично! Так что я действительно не нуждаюсь в каком-либо обслуживании в этом случае. Но я читал, что контроллер должен содержать менее 20 строк кода. Просто с этой маленькой формой у меня есть 12 строк кода. Что если мне нужно сделать больше, например, проверки и прочее?
  • 0
    Для проверки и проверки прочитайте этот symfony.com/doc/current/book/validation.html
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню