我正在使用FOSUserBundle开发Symfony2.5项目,我需要添加从同一个注册表单创建用户配置文件的功能。现在我有两个实体SysUsuario
和SysPerfil
。这是SysUsuario
的代码:
class SysUsuario extends BaseUser
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="SysGrupos")
* @ORM\JoinTable(name="sys_usuarios_grupos",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
* )
*/
protected $groups;
}
这是SysPerfil
的代码(相关部分只是属性):
class SysPerfil
{
/**
* @var integer
*
* @ORM\Column(name="idperfil", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $idperfil;
/**
* @var string
*
* @ORM\Column(name="pers_juridica", type="string", length=1, nullable=false)
*/
protected $persJuridica = 'V';
/**
* @var boolean
*
* @ORM\Column(name="rif", type="boolean", nullable=false)
*/
protected $rif;
/**
* @var boolean
*
* @ORM\Column(name="ci", type="boolean", nullable=false)
*/
protected $ci;
/**
* @var string
*
* @ORM\Column(name="nombre", type="string", length=50, nullable=true)
*/
protected $nombre;
/**
* @var string
*
* @ORM\Column(name="apellido", type="string", length=50, nullable=true)
*/
protected $apellido;
/**
* @ORM\ManyToOne(targetEntity="SysUsuario")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user", referencedColumnName="id")
* })
*/
protected $user;
}
我还创建了两个表单:UsuarioType
和PerfilType
:
UsuarioType
class UsuarioType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder
->add('perfil', new PerfilType())
->add('email', 'email', array(
'required' => true,
'label' => 'Email',
'trim' => true
))
->add('password', 'password', array(
'required' => true,
'label' => 'Contraseña',
'always_empty' => true
))
->add('confirm', 'password', array(
'required' => true,
'mapped' => false,
'label' => 'Verificar contraseña',
'always_empty' => true
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(
array(
'data_class' => 'Sunahip\UserBundle\Entity\SysUsuario',
'intention' => 'new_user'
)
);
}
public function getName()
{
return 'user_register';
}
}
PerfilType
class PerfilType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder
->add('persJuridica', 'choice', array(
'choices' => array('0' => 'V', '1' => 'J'),
'required' => true,
'label' => 'RIF',
'trim' => true
))
->add('rif', 'text', array(
'required' => true,
'label' => false,
'trim' => true
))
->add('ci', 'text', array(
'required' => true,
'label' => 'CI',
'trim' => true
))
->add('nombre', 'text', array(
'required' => true,
'label' => 'Nombre',
'trim' => true
))
->add('apellido', 'text', array(
'required' => true,
'label' => 'Apellidos',
'trim' => true
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(
array(
'data_class' => 'Sunahip\UserBundle\Entity\SysPerfil',
'intention' => 'new_user_profile'
)
);
}
public function getName()
{
return 'user_profile';
}
}
但是我收到了这个错误:
属性“perfil”和方法之一“getPerfil()”, “perfil()”,“isPerfil()”,“hasPerfil()”,“__ get()”存在并具有 “Sunahip \ UserBundle \ Entity \ SysUsuario”中的公共访问。
我的方法出了什么问题?你是怎么做到的?
答案 0 :(得分:3)
阅读异常消息。
嗯......显然没有属性$perfil
已映射到SysPerfil
课程中的SysUsuario
。
异常消息正好提示您。
如果用户没有变量/方法来存储他的个人资料......你不能添加一个表单,对吧?
<强>溶液强>
将此添加到SysUsuario
课程以解决此问题。
/**
* @ORM\OneToMany(targetEntity="SysPerfil")
*/
protected $perfil;
public function setPerfil($perfil)
{
$this->perfil = $perfil;
return $this;
}
之后不要忘记清除缓存。
另一条建议:
你绝对应该使用英语类,方法和属性名称...... 即使你不打算与不会说你的语言的人合作......它也会让你的代码更易于理解......即使它只是在stackoverflow问题中。
答案 1 :(得分:0)
您在UsuarioType类中的代码:
->add('perfil', new PerfilType())
应该是这样的:
->add('perfil', new PerfilType(),array('mapped' => false))
因为它看起来你们两个实体类之间没有映射......