【问题标题】:Symfony2 Forms: How to add data to a request object before persisting it?Symfony2 Forms:如何在持久化之前将数据添加到请求对象?
【发布时间】:2011-08-07 22:28:28
【问题描述】:

我正在关注 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 知识的一个缺点,但我在文档或在线上找不到任何示例。谢谢!

【问题讨论】:

    标签: symfony


    【解决方案1】:

    我认为您需要向 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!!!
    【解决方案2】:

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

    lifecycleCallbacks: 
    prePersist: [ doPrePersist  ]
    

    并在实体中添加此方法

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

    如果你使用注解,那么在实体中添加注解标签

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多