Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2表单映射问题_Php_Forms_Symfony - Fatal编程技术网

Php Symfony2表单映射问题

Php Symfony2表单映射问题,php,forms,symfony,Php,Forms,Symfony,Im在提交实体后与实体的数据映射方面存在问题 实体: <?php namespace Site\UserBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\EntityManager; use JMS\Serializer\Annotation as Serializer; use JMS\Serializer\Annotation\Groups; use Symfony\Component\Security

Im在提交实体后与实体的数据映射方面存在问题

实体:

<?php

namespace Site\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\EntityManager;
use JMS\Serializer\Annotation as Serializer;
use JMS\Serializer\Annotation\Groups;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection; 

/**
 * UserAddress
 *
 * @ORM\Table(name="user_address")
 * @ORM\Entity
 * 
 * @Serializer\ExclusionPolicy("all")
 * ---------- SERIALIZER GROUPS -----
 * all -- All entries
 */
class UserAddress
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * 
     * @Serializer\Type("integer")
     * @Serializer\Expose
     * @serializer\SerializedName("ID")
     * @serializer\Groups({"all"})
     */
    public $ID;

    /**
     * @var integer
     *
     * @ORM\Column(name="user_id", type="integer", nullable=false)
     */
    public $UserId;

     /**
     * @var integer
     *
     * @ORM\Column(name="level_id", type="integer", nullable=false)
     * 
     * @Serializer\Type("integer")
     * @Serializer\Expose
     * @serializer\SerializedName("LevelId")
     * @serializer\Groups({"all"})
     */
    public $LevelId;

     /**
     * @var integer
     *
     * @ORM\Column(name="address_type_id", type="integer", nullable=false)
     * 
     * @Serializer\Type("integer")
     * @Serializer\Expose
     * @serializer\SerializedName("AddressTypeId")
     * @serializer\Groups({"all"})
     * 
     * @Assert\NotBlank()
     */
    public $AddressTypeId;

    /**
     * @var string
     *
     * @ORM\Column(name="address_data", type="text", nullable=false)
     * 
     * @Serializer\Type("string")
     * @Serializer\Expose
     * @serializer\SerializedName("Address Data")
     * @serializer\Groups({"all"})
     * 
     * @Assert\NotBlank()
     */
    public $AddressData;

    /**
     * @var integer
     *
     * @ORM\Column(name="public_yn", type="integer", nullable=false)
     * 
     * @Serializer\Type("boolean")
     * @Serializer\Expose
     * @serializer\SerializedName("PublicYN")
     * @serializer\Groups({"all"})
     * 
     * @Assert\NotBlank()
     */
    public $PublicYN;

    /**
     * @var integer
     *
     * @ORM\Column(name="primary_yn", type="integer", nullable=false)
     * 
     * @Serializer\Type("boolean")
     * @Serializer\Expose
     * @serializer\SerializedName("PrimaryYN")
     * @serializer\Groups({"all"})
     * 
     * @Assert\NotBlank()
     */
    public $PrimaryYN;

     /**
    * @ORM\ManyToOne(targetEntity="Site\UserBundle\Entity\UserMain", inversedBy="UserAddress")
    * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
    */
    public $User;  

    /**
     * @ORM\ManyToOne(targetEntity="Site\UserBundle\Entity\UserAddressType", inversedBy="UserAddress")
     * @ORM\JoinColumn(name="address_type_id", referencedColumnName="address_type_id")
     * 
     * @Serializer\Type("Site\UserBundle\Entity\UserAddressType")
     * @Serializer\Expose
     * @serializer\SerializedName("UserAddressType")
     * @serializer\Groups({"all"})
     */
     public $UserAddressType;




    /**
     * Get ID
     *
     * @return integer 
     */
    public function getID()
    {
        return $this->ID;
    }

    /**
     * Set UserId
     *
     * @param integer $userId
     * @return UserAddress
     */
    public function setUserId($userId)
    {
        $this->UserId = $userId;

        return $this;
    }

    /**
     * Get UserId
     *
     * @return integer 
     */
    public function getUserId()
    {
        return $this->UserId;
    }

    /**
     * Set LevelId
     *
     * @param integer $levelId
     * @return UserAddress
     */
    public function setLevelId($levelId)
    {
        $this->LevelId = $levelId;

        return $this;
    }

    /**
     * Get LevelId
     *
     * @return integer 
     */
    public function getLevelId()
    {
        return $this->LevelId;
    }

    /**
     * Set AddressTypeId
     *
     * @param integer $addressTypeId
     * @return UserAddress
     */
    public function setAddressTypeId($addressTypeId)
    {
        $this->AddressTypeId = $addressTypeId;

        return $this;
    }

    /**
     * Get AddressTypeId
     *
     * @return integer 
     */
    public function getAddressTypeId()
    {
        return $this->AddressTypeId;
    }

    /**
     * Set AddressData
     *
     * @param string $addressData
     * @return UserAddress
     */
    public function setAddressData($addressData)
    {
        $this->AddressData = $addressData;

        return $this;
    }

    /**
     * Get AddressData
     *
     * @return string 
     */
    public function getAddressData()
    {
        return $this->AddressData;
    }

    /**
     * Set PublicYN
     *
     * @param integer $publicYN
     * @return UserAddress
     */
    public function setPublicYN($publicYN)
    {
        $this->PublicYN = $publicYN;

        return $this;
    }

    /**
     * Get PublicYN
     *
     * @return integer 
     */
    public function getPublicYN()
    {
        return $this->PublicYN;
    }

    /**
     * Set PrimaryYN
     *
     * @param integer $primaryYN
     * @return UserAddress
     */
    public function setPrimaryYN($primaryYN)
    {
        $this->PrimaryYN = $primaryYN;

        return $this;
    }

    /**
     * Get PrimaryYN
     *
     * @return integer 
     */
    public function getPrimaryYN()
    {
        return $this->PrimaryYN;
    }

    /**
     * Set User
     *
     * @param \Site\UserBundle\Entity\UserMain $user
     * @return UserAddress
     */
    public function setUser(\Site\UserBundle\Entity\UserMain $user = null)
    {
        $this->User = $user;

        return $this;
    }

    /**
     * Get User
     *
     * @return \Site\UserBundle\Entity\UserMain 
     */
    public function getUser()
    {
        return $this->User;
    }

    /**
     * Set UserAddressType
     *
     * @param \Site\UserBundle\Entity\UserAddressType $userAddressType
     * @return UserAddress
     */
    public function setUserAddressType(\Site\UserBundle\Entity\UserAddressType $userAddressType = null)
    {
        $this->UserAddressType = $userAddressType;

        return $this;
    }

    /**
     * Get UserAddressType
     *
     * @return \Site\UserBundle\Entity\UserAddressType 
     */
    public function getUserAddressType()
    {
        return $this->UserAddressType;
    }
}
控制器函数是:(我正在使用fosrestbundle)

))); }

细枝模板非常简单。所有数据都已正确发布到服务器:(查询字符串参数)

但我一直得到以下错误:

An exception occurred while executing 'INSERT INTO user_address (user_id, level_id, address_type_id, address_data, public_yn, primary_yn) VALUES (?, ?, ?, ?, ?, ?)' with params [null, 0, null, "555-555-5555", "false", "false"]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null
如您所见,UserID和AddressTypeId字段没有从表单映射到实体。我已经仔细检查了所有3个部分的代码,在我的一生中,我看不出哪里发生了不匹配。我曾经更改过实体中这两个字段的名称,但是我删除了所有的getter和setter并重新生成它们,同时清除了dev缓存

我的直觉是Symfony2中有一个文件,有一个映射类出错,但我找不到它

谢谢大家

编辑:

我尝试清除条令缓存,如下所述:

这会导致生成相同的错误,因此缓存问题可能不在表中

编辑:

根据艾萨克的建议,我删除了
->添加('UserId','hidden')
。表单仍以相同的错误消息发布。该字段正在正确生成到页面;
正如您可以从上面的查询参数中看到的,这些参数被正确地发回服务器

编辑:

我跟踪了
User
UserAddressType
变量的问题。如果我删除这两个变量及其getter和setter,那么表单就可以完美地工作,而无需对代码进行其他修改。我应该注意,这两个变量是与其他实体的连接。有些人似乎正在清除表单提交的数据。

删除

->add('UserId','hidden')

它可能会用null覆盖UserId,因为它是隐藏的,没有任何值

,根据lsouza的建议,我必须创建一个

请注意,
Transformer
函数当前返回null,但这应该返回一个表单可以使用的值

其他一些可能对其他人有所帮助的注意事项是表单类也需要更改

setDefaultOptions
函数需要将以下内容添加到
$resolver
变量中:

    ->setRequired(array(
        'em',
    ))
    ->setAllowedTypes(array(
        'em'=>'Doctrine\Common\Persistence\ObjectManager',
    ));
需要稍微更改
buildForm
函数以接受
em
选项:

public function buildForm(FormBuilderInterface $builder, array $options)
{
   $em = $options['em'];
   $transformer = new AddressTypeToNumber($em);
该字段需要更改为保存实体中关系的变量,而不是链接中使用的字段:

    ->add(
        $builder->create('UserAddressType', 'entity', array(
            'class' => 'SiteUserBundle:UserAddressType',
            'property' => 'AddressDescription',
            'label' => 'Address Type'
        ))
        ->addModelTransformer($transformer)
    )
最后,在控制器中,需要将
$this->getDoctrine()->getManager()
的实例传递给form类:

$form = $this->createForm( new UserAddressType(), $address, array(
    'em' => $this->getDoctrine()->getManager(),
));

我希望这对其他人有帮助。

谢谢你的建议,但我试过了,没有效果。在生成表单之前,将用户ID添加到实体中,并且表单将正确的用户ID传递回操作。通过浏览器中的查询参数和HTML源进行验证。将编辑组织问题以反映此信息。尝试查看在执行$address->getUserId()操作时,
if($form->isValid()){
之后是否仍有值正在返回3,这是表单中传递的用户ID,因此正在工作。细分似乎在查询生成中。添加
$address->getAddressTypeId()时使问题复杂化
我收到一个“无法转换为字符串”错误。我建议安装
LadybugBundle
进行调试。它允许您以更有意义的方式转储对象。++FyodorX--Nice bundle。我做了一个var转储,
UserID
与其余数据一起添加到
UserAddress
对象中。正在工作现在在
DataTransformer
上。您可能必须使用。是的,它看起来像
AddressTypeId
从您的
Type
中获取一个
实体。如果您希望模型使用id和视图使用实体,则需要编写
DataTransformer
namespace Site\UserBundle\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Doctrine\Common\Persistence\ObjectManager;

use Site\UserBundle\Entity\UserAddressType;

class AddressTypeToNumber implements DataTransformerInterface
{
    /**
     * @var ObjectManager
     */
    private $om;

    /**
     * @param ObjectManager $om
     */
    public function __construct(ObjectManager $om)
    {
        $this->om = $om;
    }

    /**
     * Transforms an object(val) to a string
     * 
     * @param UserAddressType|null $val
     * @return string
     */
    public function transform($val)
    {
        if (null === $val) {
            return "";
        }

        return array();
    }

    /**
     * Transfers a string to an object (UserAddressType)
     * 
     * @param string $val
     * @return UserAddressType|null 
     * @throws TransformationFailedException if object is not found
     */
    public function reverseTransform($val)
    {
        if (!$val) {
            return null;
        }

        $addId = $this->om
            ->getRepository('SiteUserBundle:UserAddressType')
            ->findOneBy(array('AddressTypeId' => $val));  

         if (null === $addId) {
             throw new TransformationFailedException(sprintf(
                'An Address Type with the ID of "%s" does not exsist in the system',
                $val
             ));
         }

        return $addId;
    }
}
    ->setRequired(array(
        'em',
    ))
    ->setAllowedTypes(array(
        'em'=>'Doctrine\Common\Persistence\ObjectManager',
    ));
public function buildForm(FormBuilderInterface $builder, array $options)
{
   $em = $options['em'];
   $transformer = new AddressTypeToNumber($em);
    ->add(
        $builder->create('UserAddressType', 'entity', array(
            'class' => 'SiteUserBundle:UserAddressType',
            'property' => 'AddressDescription',
            'label' => 'Address Type'
        ))
        ->addModelTransformer($transformer)
    )
$form = $this->createForm( new UserAddressType(), $address, array(
    'em' => $this->getDoctrine()->getManager(),
));