Php Symfony2表单映射问题
Im在提交实体后与实体的数据映射方面存在问题 实体: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
<?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(),
));