使用Symfony2将实体字段编辑为null

时间:2014-10-06 06:21:23

标签: php symfony

如果此字段之前具有值,则在将Entity字段编辑为NULL时出错。对于第一次持久化到数据库,我可以提交NULL值。将值更改回NULL时发生此错误:

  

捕获致命错误:参数1传递给   Sifo \ SharedBundle \ Entity \ BlogMenu :: setBlogPage()必须是一个实例   Sifo \ SharedBundle \ Entity \ BlogPage,null给定,调用   C:\ Sifony \厂商\ symfony的\ symfony的\ SRC \的Symfony \元器件\ PropertyAccess \ PropertyAccessor.php   在第438行并在中定义   C:\ Sifony \ src \ Sifo \ SharedBundle \ Entity \ BlogMenu.php第332行

这是我的实体BlogMenu.php第332行:

// ...

 * Set blogPage
 *
 * @param \Sifo\SharedBundle\Entity\BlogPage $blogPage
 * @return blogPage
 */
public function setBlogPage(\Sifo\SharedBundle\Entity\BlogPage $blogPage) // Line 332
{
    $this->blogPage = $blogPage;

    return $this;
}

/**
 * Get blogPage
 *
 * @return \Sifo\SharedBundle\Entity\BlogPage 
 */
public function getBlogPage()
{
    return $this->blogPage;
}

// ...
我的控制器中的

updateAction是这样的:

/**
 * Edits an existing BlogMenu entity.
 *
 */
public function updateAction(Request $request, $id)
{
    $user = $this->getUser();
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('SifoSharedBundle:BlogMenu')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find BlogMenu entity.');
    }

    $entity->setOperator($user->getName());
    $form = $this->createEditForm($entity);
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em->flush();

        return $this->redirect($this->generateUrl('admin_blog_menu_show', array('id' => $id)));
    }

    return $this->render('SifoAdminBundle:edit:layout.html.twig', array(
        'entity' => $entity,
        'form'   => $form->createView(),
        'user'   => $user,
    ));
}

这是我的FormType:

<?php

// ...

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('blog_page', 'entity', array(
                'required' => false, 
                'empty_value' => 'admin.choice.choosePage',
                'class' => 'Sifo\SharedBundle\Entity\BlogPage'))

// ...

3 个答案:

答案 0 :(得分:2)

将您的代码修改为此

public function setBlogPage(\Sifo\SharedBundle\Entity\BlogPage $blogPage = null) 
{
    $this->blogPage = $blogPage;

    return $this;
}

正如我在评论中告诉你的那样,这归因于type hinting。类型提示用于检查传递给函数的参数的类型(类;不是基本类型,可以检查this answer)。如果您想让您的函数接受null类型,则应指定它。

最好使用类型提示,因为它更安全&#34;并且不会导致&#34;副作用&#34; (如果可能的话)。让我们考虑第三方库或供应商:如果您使用第三方库中的函数,您应该知道参数类型,如果您尝试传递错误的类型,那么&#34;编译器&#34; (解析器)会通知你。

答案 1 :(得分:0)

我不确定这是否是解决此问题的好方法。我在我的实体中删除了变量声明作为实体。

 * Set blogPage
 *
 * @param \Sifo\SharedBundle\Entity\BlogPage $blogPage
 * @return blogPage
 */
public function setBlogPage($blogPage) // Line 332
{
    $this->blogPage = $blogPage;

    return $this;
}

答案 2 :(得分:0)

在我的情况下,问题出在php.ini max_input_vars变量中。默认情况下是1000,但我发送了3k +
这两个想法都是不好的:允许为null并删除声明