Php Symfony,创建表单输入“;“保存并保留”;服务

Php Symfony,创建表单输入“;“保存并保留”;服务,php,symfony,Php,Symfony,形势 例如,我有一个处理页面编辑的控制器 /** * 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

形势

例如,我有一个处理页面编辑的控制器

/**
 * 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_和_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()
    ));

因此,您将检查是否单击了“保存并转到索引”按钮-如果是,则重定向到该按钮。否则,只需使用插入的值再次渲染表单。

我以为用户可以使用F5重新发送表单,但Symfony足够聪明,可以防止它,太棒了!所以在这种情况下我真的不需要任何服务。但是我读到一个控制器应该包含少于20行的代码。就用这个小表格,我有12行代码。如果我需要做更多的事情,比如验证什么的呢?为了检查和验证,我想读一读关于控制器少于20行的“硬规则”有点极端。控制器应该相当“薄”,但我不认为教条式的只有20行是一个有用的规则。要了解更多关于服务的信息,请查看-真正理解它需要一些时间,但只需使用几次,我想您将开始掌握它的窍门。是的,我知道验证约束,它功能强大。好的,我将简单地编写我必须的代码,如果我意识到我需要相同的功能两次,我将使用这些服务。20行代码似乎真的很难遵守我同意,我经常检查其他大捆绑包(FOS、Sonata&co)以了解,他们似乎并不真的担心。谢谢最后不,Symfony不够聪明,当用户点击F5时,表单被重新发送。所以我真的需要一个if/else验证