0

我有一个简单的课程:

class Type
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=15)
     */
    private $name;

    ... 
}

并在数据库中有一些“类型”对象。因此,如果我想更改其中一个,我会创建新的控制器规则(如 /types/edit/{id})和新操作:

public function typesEditViewAction($id)
{   
    ... 
    $editedType = new Type();

    $form = $this->createFormBuilder($editedType)
        ->add('name', 'text')
        ->add('id', 'hidden', array('data' => $id))
        ->getForm();

    // send form to twig template
    ...
}

之后,我创建另一个控制器规则(如 /types/do_edit)和操作:

public function typesEditAction(Request $request)
{   
    ... 
    $editedType = new Type();

    $form = $this->createFormBuilder($editedType)
        ->add('name', 'text')
        ->add('id', 'hidden')
        ->getForm();

    $form->bind($request); // <--- ERROR THERE !!!

    // change 'type' object in db
    ...
}

我在那里发现了一个小问题。Сlass 'Type' 没有自动生成的 setter setId() 并且在绑定时出现错误。

Neither the property "id" nor one of the methods "setId()", "__set()" or "__call()" exist and have public access in class "Lan\CsmBundle\Entity\Type".

现在,我从 symfony2 表单对象 ($form) 中删除 'id' 字段并将其手动传输到模板。在第二个控制器的操作中,我将 $form 对象和“id”字段分开。我不知道这样做的“正确”方式(更新“类型”类)。请帮忙。

4

2 回答 2

2

Symfony 有一个集成的ParamConverter,它会自动从数据库中获取您的实体,并在找不到实体时抛出异常(您可以在侦听器中捕获)。

您可以在一种控制器方法中轻松处理 GET 和 POST 请求。

确保您拥有实体中属性的公共 getter 和 setter。

我添加了注释以使路由更清晰,并且仍然有一个工作示例。

use Vendor\YourBundle\Entity\Type;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

// ...

/** 
 *  @Route("/edit/{id}", requirements={"id" = "\d+"})
 *  @Method({"GET", "POST"})
 */
public function editAction(Request $request, Type $type)
{   

    $form = $this->createFormBuilder($type)
        ->add('name', 'text')
        ->add('id', 'hidden')
        ->getForm()
    ;

    if ($request->isMethod('POST')) {
         $form->bind($request);

         if ($form->isValid())
         {
              $em = $this->getDoctrine()->getEntityManager();
              $em->flush();          // entity is already persisted and managed by doctrine.

              // return success response
         }
    }

    // return the form ( will include the errors if validation failed )
}

我强烈建议您创建一个表单类型来进一步简化您的控制器。

于 2013-07-18T15:11:59.923 回答
1

对于任何其他绊倒您将 ID 字段添加到 FormType 的人,因为前端需要它,您可以将 ID 列设置为“未映射”,如下所示:

->add('my_field', 'hidden', ['mapped'=>false])

它可以防止 ID 值试图被表单处理方法使用。

于 2016-01-11T15:09:38.903 回答