symfony 表单保存数据的问题

Posted

技术标签:

【中文标题】symfony 表单保存数据的问题【英文标题】:Problems with symfony form to save data 【发布时间】:2015-11-18 14:50:00 【问题描述】:

我开始学习 Symfony2,我正在做一个输入日期的表格。当我尝试保存收到的日期时:

使用参数 [null, null] 执行“INSERT INTO date (date,critical) VALUES (?, ?)”时发生异常:

SQLSTATE[23000]:违反完整性约束:1048 列“日期”不能为空。

上课日期在这里:

上课日期

/**
 *
 * @ORM\Id
 *
 * @ORM\Column(type="integer")
 *
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id_date;

/**
 *
 * @ORM\Column(type = "date")
 */
protected $date;

/**
 *
 * @ORM\Column(name="critical", type="boolean")
 */
protected $critical;

/**
 *
 * @ORM\OneToMany(targetEntity = "Category", mappedBy ="date")
 */
protected $categories;

在表单类型中:

类 DateType 扩展 AbstractType

public function buildForm(FormBuilderInterface $builder, array $options) 
    $builder->add('date');
    $builder->add('critical');
    $builder->add('save', 'submit');        


public function getName() 
    return 'date';


public function getCritical() 
    return 'critical';


public function getDefaultOptions(array $options) 
    return array(
        'data_class' => 'GuardBundle\Entity\Date',
    );

在控制器中:

public function gesDateAction(Request $request) 
    $date = new Date();
    $form = $this->createForm(new DateType(), $date);
    if ($request->getMethod() == 'POST') 
        $em = $this->getDoctrine()->getManager();
        $em->persist($date);
        $em->flush();
        return $this->render('GuardBundle:Dates:gesDates.html.twig', array(
                    'form' => $form->createView()));
    
    return $this->render('GuardBundle:Fechas:gesDates.html.twig', array(
                'form' => $form->createView()));

在视图中:

<form action="ges_date" method="post"  form_enctype(form) >    
    <br>
     form_row(form.date) 
     form_row(form.critical) 
     form_row(form.save)    
    <br>
</form>

请帮助我,非常感谢你

【问题讨论】:

也许您发送带有初始日期对象的发布请求。因此,当您持久化实体时,您的日期对象为空。阅读食谱symfony.com/doc/current/cookbook/form/direct_submit.html 并可能使用handleRequest,它应该可以工作:) 【参考方案1】:

您没有告诉表单“处理”当前请求。因此,您正在使用您的实体创建表单,然后检查请求方法是POST,然后直接跳转到持久化您的实体。这是您控制器中的快速更改:

public function gesDateAction(Request $request) 
    $date = new Date();
    $form = $this->createForm(new DateType(), $date);
    if ($request->getMethod() == 'POST') 
        $form->handleRequest($request);

        if ($form->isValid()) 
            $em = $this->getDoctrine()->getManager();
            $em->persist($date);
            $em->flush();
            return $this->render('GuardBundle:Dates:gesDates.html.twig', array(
                    'form' => $form->createView()));
        
    

    return $this->render('GuardBundle:Fechas:gesDates.html.twig', array(
            'form' => $form->createView()));

我还添加了$form-&gt;isValid() 检查,就好像您向实体添加约束一样,这将捕获它们。

【讨论】:

【参考方案2】:

问题似乎是您没有使用 handleRequest() :

请求处理 handleRequest() 方法是在 Symfony 2.3 中引入的。 要处理表单数据,您需要调用 handleRequest() 方法:

1 $form->handleRequest();

您可以找到更多信息: http://symfony.com/doc/current/components/form/introduction.html

【讨论】:

以上是关于symfony 表单保存数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

从没有表单的URL保存图像(Symfony 3)

Symfony 2 - 无法使用集合保存表单

symfony2 构建表单实体 oneToMany

Symfony 4 EasyAdminBundle:纯密码的编码和保存问题

Symfony 实体不保存到持久化数据库

Symfony2-Doctrine:ManyToMany 关系未保存到数据库