【问题标题】:handle request of incomplete missing fields symfony form处理不完整的缺失字段 symfony 表单的请求
【发布时间】:2017-07-01 02:58:24
【问题描述】:

我创建了一个带有任务实体的小型 Symfony (Sf3.2 + php7) 网络。我有我的控制器,我有一个新动作来创建一个新任务。一切都很好。现在,某些表单字段不需要填写(例如,创建日期)。所以我已经从我的taskType中删除了:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add->('name')->add('description');
}

现在我的表单看起来完全符合我的要求。令人惊讶的是,当我提交它时,我的控制器将它传递给教义,并且每个缺失的字段都写为 NULL。不!,我不想要那个,我想要的是我的默认 mysql 值。

好的,我阅读了文档。似乎有两种处理数据的方式:

$form->handleRequest($request);
$form->submit($request->request->get($form->getName()));

我在提交的 API(不是在文档中)中找到了第二个参数,一个布尔值:

API 说:

bool    $clearMissing   Whether to set fields to NULL when they are missing in the submitted data.

太棒了!这正是我所需要的。来看看吧:

public function newAction(Request $request) {
    $task = new Task();

    $form = $this->createForm('myBundle\Form\TaskType', $task);
    $form->submit($request->request->get($form->getName()), false);
    if ($form->isSubmitted() && $form->isValid()) {


        $em = $this->getDoctrine()->getManager();
        $em->persist($task);
        $em->flush();
        $response = new Response();
        $response->setContent(json_encode(array(
            'data' => 'success',
        )));
        $response->headers->set('Content-Type', 'application/json');
        return $response;

        return $this->redirectToRoute('task_success');
    }
    return $this->render('task/new.html.twig', array(
                'task' => $task,
                'form' => $form->createView(),
    ));
}

好吧,在尝试了一切之后,我总是在所有缺失的字段中得到 NULL。我做错了什么。

谢谢你,卡特琳娜。

恐怕肯定还有更多。我在想这也许不是 Doctrine 的解决方案。 Symfony 日志向我显示了插入内容,它在每个空字段、空字段和缺失字段中设置了 Null。在状态等字段中,我可以在教义级别设置默认值,但如果我想设置 created_at 字段,我想必须是 Mysql 负责设置当前时间戳。

无论如何,这是我的任务实体的 ORM 属性状态。

/**
 * @var \scrumBundle\Entity\Taskstatus
 *
 * @ORM\ManyToOne(targetEntity="scrumBundle\Entity\Taskstatus")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="status", referencedColumnName="id")
 * })
 * @ORM\Column(name="status", type="integer", nullable=false,options={"default":1})
 */
private $status;

这是来自 TaskStatus 的属性 ID:

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false, options={"default":1})
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

如您所见,我尝试按照您的建议设置选项默认值。我尝试创建以使用 handleRequest 设置表单并以相同的结果提交

$task = new Task();
$form = $this->createForm('scrumBundle\Form\TaskType', $task);
//$form->handleRequest($request);
$form->submit($request->request->get($form->getName()), false);
if ($form->isSubmitted() && $form->isValid()) {

我什至尝试一步一步调试提交函数,一个真正的地狱,因为提交对我来说是一个非常复杂的递归函数。

好的,再次感谢您的时间。 问候,凯特

附言。对不起我的英语不好。;^)

【问题讨论】:

  • 您需要在您的实体中明确设置默认值。 Doctrine 总是会保留您实体中的所有字段,因此无论您的表单如何,它们仍然是“null”。在 ORM 列定义、LifecycleCallback 或实体的构造函数上设置默认值。在这里查看一些解决方案。 - stackoverflow.com/questions/3376881/default-value-in-doctrine
  • 非常感谢!我怀疑我的实体。我一试就告诉你
  • Symfony 1 - Cate 0,查看我的编辑。请帮忙

标签: forms symfony request


【解决方案1】:

简短的回答——当你通过 Doctrine 持久化一个 PHP 对象时,你必须绝对拥有你想要的每一个值集。如果您的 PHP 对象有空字段,Doctrine 将在您的实体中手动将它们设置为null。 Doctrine 不会仅仅因为您的 PHP 对象中的值是 null 就假设您不希望它包含在您的 INSERT 语句中。这是因为null 是一个完全有效的 SQL 值。

因此,无论您的 PHP 对象在插入时是什么,都正是将要插入到您的数据库中的内容,null 值等等。

当您编辑条目时,Doctrine 只会更新不同的字段,所以这不是问题。您关心的是何时持久化实体。

最简单的解决方案是将 MySQL 默认值复制到 PHP 实体中。喜欢以下多种方式之一:

// set default value on the variable itself
public $someVar = 100;

// set default values in the constructor (so when creating a new entry)
public function __construct()
{
    $this->createdAt = new \DateTime();
    $this->isActive  = true;
}

也可以在插入新条目时使用Lifecycle Callbacks进行设置:

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class Task
{
    // ...

    /**
     * @ORM\PrePersist
     */
    public function setCreatedAtValue()
    {
        $this->createdAt = new \DateTime();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多