Symfony2 Forms:如何在持久化之前将数据添加到请求对象?

时间:2011-08-07 22:28:29

标签: symfony

我正在关注Symfony2的表单处理:

public function createAction()
 {
    $entity  = new Node();
    $request = $this->getRequest();
    $form    = $this->createForm(new NodeType(), $entity);

    $form->bindRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($entity);

        $em->flush();

问题是“节点”实体有一些其他字段不是由用户填充的,而是由控制器脚本中的进程填充的。这些“系统生成的”值也应与表单中的“用户生成”值一起保留。

我不确定如何将系统值添加到实体。

这是我的OOP知识的缺点,但我在文档或在线中找不到任何示例。谢谢!

2 个答案:

答案 0 :(得分:2)

我认为你需要在Node类中添加一些getXXX / setXXX方法(或者查看它们的类代码),所以你的代码看起来像

$em = $this->getDoctrine()->getEntityManager();

$entity->setPropertyOne('some value of mine');
$entity->setCurrentUserId($this->get('security.context')
                          ->getToken()->getUser()->getId());
// another entity setters

$em->persist($entity);

在你的情况下不知道它是否会对你有帮助,但我建议阅读有关Doctrine 2事件的here

我还强烈建议你阅读这篇文章(非正式的)Symfony2 book :)

答案 1 :(得分:1)

如果您想在实体中而不是在控制器中进行管理。如果您正在使用YML,那么只需将其添加到YML文件

即可
lifecycleCallbacks: 
prePersist: [ doPrePersist  ]

并在实体中添加此方法

function doPrePersist() 
{
    $this->publish = true;
    $this->isDeleted = false;
}

如果您正在使用注释,则在实体中添加注释标记

/**
 * @ORM\prePersist
 */
function doPrePersist() 
{
    $this->publish = true;
    $this->isDeleted = false;
}