在Symfony2中处理用户和配置文件的方法

时间:2014-07-08 00:14:17

标签: php symfony fosuserbundle

我正在使用FOSUserBundle开发Symfony2.5项目,我需要添加从同一个注册表单创建用户配置文件的功能。现在我有两个实体SysUsuarioSysPerfil。这是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;

}

我还创建了两个表单:UsuarioTypePerfilType

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”中的公共访问。

我的方法出了什么问题?你是怎么做到的?

2 个答案:

答案 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))
  

因为它看起来你们两个实体类之间没有映射......