Php Symfony 2嵌入式表单
我将一个表单类型嵌入到另一个表单类型中,如下所示Php Symfony 2嵌入式表单,php,forms,symfony,symfony-forms,Php,Forms,Symfony,Symfony Forms,我将一个表单类型嵌入到另一个表单类型中,如下所示 $builder->add('parent', new \Company\Bundle\Form\UserObjects\AParentType); 但是,当我尝试将请求绑定到表单时 if($request->getMethod() == 'POST') { $form->bindRequest($request); } 我得到了错误 可捕获的致命错误:传递给Company\Bundle\Entity\UserO
$builder->add('parent', new \Company\Bundle\Form\UserObjects\AParentType);
但是,当我尝试将请求绑定到表单时
if($request->getMethod() == 'POST') {
$form->bindRequest($request);
}
我得到了错误
可捕获的致命错误:传递给Company\Bundle\Entity\UserObjects\User::setParent()的参数1必须是Company\Bundle\Entity\UserObjects\AParent的实例,数组给定,在第346行的/Volumes/Media/Symfony/vendor/Symfony/src/Symfony/Component/Form/Util/PropertyPath.php中调用,并在第771行的/Volumes/Media/Symfony/src/Company/Bundle/Entity/UserObjects/User.php中定义
表单似乎将“AParent”对象作为数组而不是实体传递。有什么想法吗
已编辑
User.php
<?php
// src/Company/Bundle/Entity/UserObjects/Users.php
namespace Company\Bundle\Entity\UserObjects;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="Company\Bundle\Repository\UserObjects\UserRepository")
* @ORM\Table(name="user")
* @ORM\HasLifecycleCallbacks()
*/
class User implements UserInterface, \Serializable
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $username;
/**
* @ORM\Column(type="string")
*/
protected $password;
/**
* @ORM\Column(type="string")
*/
protected $securityQuestion;
/**
* @ORM\Column(type="string")
*/
protected $securityAnswer;
/**
* @ORM\Column(type="string")
*/
protected $salt;
/**
* @ORM\OneToOne(targetEntity="AParent", inversedBy="user")
*/
private $parent;
public function serialize()
{
return serialize(array(
'username' => $this->getUsername(),
'password' => $this->getPassword(),
'salt' => $this->getSalt(),
'roles' => $this->getRoles(),
));
}
public function unserialize($serializedData)
{
$unserializedData = unserialize($serializedData);
$this->setUsername(isset($unserializedData['username']) ? $unserializedData['username'] : null);
$this->setPassword(isset($unserializedData['password']) ? $unserializedData['password'] : null);
$this->setSalt(isset($unserializedData['salt']) ? $unserializedData['salt'] : null);
}
public function getRoles()
{
return array('ROLE_USER');
}
public function eraseCredentials()
{
return false;
}
public function equals(UserInterface $user)
{
if ($user->getUsername() != $this->getUsername()) {
return false;
}
if ($user->getEmail() != $this->getEmail()) {
return false;
}
return true;
}
/**
* Get password
*
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* Get salt
*
* @return string
*/
public function getSalt()
{
return $this->salt;
}
public function getUsername()
{
return $this->username;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set username
*
* @param string $username
*/
public function setUsername($username)
{
$this->username = $username;
}
/**
* Set password
*
* @param string $password
*/
public function setPassword($password)
{
$this->password = $password;
}
/**
* Set securityQuestion
*
* @param string $securityQuestion
*/
public function setSecurityQuestion($securityQuestion)
{
$this->securityQuestion = $securityQuestion;
}
/**
* Get securityQuestion
*
* @return string
*/
public function getSecurityQuestion()
{
return $this->securityQuestion;
}
/**
* Set securityAnswer
*
* @param string $securityAnswer
*/
public function setSecurityAnswer($securityAnswer)
{
$this->securityAnswer = $securityAnswer;
}
/**
* Get securityAnswer
*
* @return string
*/
public function getSecurityAnswer()
{
return $this->securityAnswer;
}
/**
* Set salt
*
* @param string $salt
*/
public function setSalt($salt)
{
$this->salt = $salt;
}
/**
* Set parent
*
* @param Company\Bundle\Entity\UserObjects\AParent $parent
*/
public function setParent(\DABSquared\ProjectGradesBundle\Entity\UserObjects\AParent $parent)
{
$this->parent = $parent;
if($parent != null) {
$parent->setUser($this);
}
}
/**
* Get parent
*
* @return Company\Bundle\Entity\UserObjects\AParent
*/
public function getParent()
{
return $this->parent;
}
}
public function __construct()
{
}
}
您尚未在AParentType表单中设置数据类。你是这样做的:
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Project\MyBundle\Entity\AParent',
);
}
对于Symfony的更高版本,您需要使用以下选项:
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
//...
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Project\MyBundle\Entity\AParent',
));
}
替换此项:
->add('parent', new \Company\Bundle\Form\UserObjects\AParentType);
为此:
->add('parent', new AParentType());
因为您已经包含了名称空间
如果在表单模板中是一对一的,您可以:
{{ form_row(form.parent.zipCode) }}
希望这能奏效。您的实体定义看起来不错:-)在您的第一个代码段中,类名后面的括号不是必须的吗?如果您能看到更多的代码,这也会很有帮助。这并不能告诉我们太多。@greg0ire我不这么认为,因为表单在页面上构建和显示得很好,但当表单发布并绑定到用户对象时,就是发生此错误的时候。@Jamie您还想看到什么,实际上没有那么多,我现在也不在计算机旁处理代码。您的实体定义和表单类。看起来关系有点问题,这很有效!非常感谢你!真不敢相信我竟然忘了那个方法,它现在有这么多意义!三年多后遇到这个问题哈!!最初的解决方案无效,但将setDefaultOptions
与选项resolvernterface
配合使用效果很好。我已将其添加到您的解决方案中。
->add('parent', new \Company\Bundle\Form\UserObjects\AParentType);
->add('parent', new AParentType());
{{ form_row(form.parent.zipCode) }}