【问题标题】:Symfony Good practice : How to embed several forms for a single entity, handled by different controllersSymfony 良好实践:如何为单个实体嵌入多个表单,由不同的控制器处理
【发布时间】:2015-09-01 07:46:37
【问题描述】:

我正在使用 Symfony 2 开发一个应用程序,我对这个框架很陌生。

我想创建一个代表用户个人资料的页面,用户可以在该页面上更新他们的个人信息、设置个人资料图片和封面图片。

我已经为 User 类和模板编写了代码。对于个人资料和封面图片,我使用带有 formdata 的 ajax 将图像发送到服务器。

其他字段(用户名、电子邮件等)也使用 ajax 发送,但表单的所有三个部分(个人资料图片、封面图片、文本字段)都有自己的提交按钮。

我的问题是关于创建控制器和表单。

  • 是否应该创建一个控制器来呈现个人资料页面,然后创建一个控制器来处理表单?

  • 我应该为页面上的所有字段创建一个表单,还是创建三个单独处理的表单?

  • 我应该使用 formbuilder 创建表单吗?如果有多个控制器,如何在其他控制器中检索在第一个控制器中创建的表单以进行验证

  • 或者我一开始就错了...?

我可以提供我当前的代码,但我认为它没有用,因为我的 User 类和我的模板非常基本,我一直在编写其余的代码;而且我更喜欢在编写太多垃圾代码之前了解“好”的做法。

【问题讨论】:

    标签: ajax forms symfony controller


    【解决方案1】:

    您可以有多种形式并在一个控制器中验证它们:

    public function updateAction(Request $request)
    {
    
        $form_one = $this->get('form.factory')
                ->createNamedBuilder('form_one', 'form')
                ->add('user_picture', 'file')
                ->add('submit', 'submit')
                ->getForm()
                ->handleRequest($request);
    
        // Next form ...
    
         if ($form_one->isValid())
        {
            // Save user picture
    
           $data = 'user picture saved';
        }
    
        // Other forms validation
    
        return new JsonResponse(data);
    }
    

    确保在用户配置文件控制器视图中创建相同的表单。

    【讨论】:

    • 这是否意味着我必须使用isValid() 检查每个表单才能知道哪个正在更新?
    • 基本上是的,但是你可以在请求中查看表单名称。
    • 在您的示例代码中,我不明白表单和实体的链接位置。我必须在哪里指定 formType 模型?
    • 抱歉,表单类型是第二个参数,而您在createNamedBuilder('form_name', 'form_type', $entity) 中将实体作为第三个参数传递。但实际上如果你使用表单类型,你可以通过普通的createBuilder方法来完成,而你的表单类型有方法getName()
    • 好的。谢谢,我认为使用 formType 能够在页面控制器和表单处理程序控制器中再次生成相同的表单要简单得多。似乎可以找到列表。
    【解决方案2】:

    我应该使用 formbuilder 创建表单吗? 不仅仅是一个控制器,如何检索创建的表单 其他控制器中第一个进行验证的控制器

    你可以制作formType,就像在这个example中,有RegistrationType。 然后在不同的控制器中使用formType

    然后你可以使用entity validators从实体(或任何教义、推进或任何你使用的东西)验证表单

    您也可以查看generator bundle,特别是Generating a New Form Type Class Based on a Doctrine Entity

    【讨论】:

    • formType 听起来不错,但在我的情况下,最好为整个页面创建一个表单,还是创建三个不同的 formType,每个可提交的“正面”表单一个?
    • 我引用了问题,对于女巫我有答案 ;) 我不确定我是否可以为多种形式和单一形式提供好的答案
    【解决方案3】:

    Symfony 最佳实践说为表单使用自定义表单类型类 link

    我总是对单独的表单使用单独的控制器操作。代码变得更有条理,更容易调试。而且我在同一个控制器中遇到了多个表单的问题/错误。

    【讨论】:

    • 感谢您的链接,我不知道 Symfony 文档中的“最佳实践”部分。但是我的代码无论如何都不会是“好”的,因为在我的模板中我只是不知道使用 Symfony 表单,但我只是发送包含同名字段的 formData 来发送图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多