【问题标题】:Approach to handle users and profiles in Symfony2在 Symfony2 中处理用户和配置文件的方法
【发布时间】:2014-07-08 00:14:17
【问题描述】:

我正在使用 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”类中的公共访问权限。

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

【问题讨论】:

    标签: php symfony fosuserbundle


    【解决方案1】:

    阅读异常消息。

    嗯......显然没有属性$perfil 映射到您的SysUsuario 类中的SysPerfil

    这正是 异常消息 提示您的内容。

    如果用户没有变量/方法来存储他的个人资料......你不能用表格添加一个,对吧?

    解决方案:

    将此添加到您的SysUsuario 课程以解决此问题。

    /**
      * @ORM\OneToMany(targetEntity="SysPerfil")
      */
    protected $perfil;
    
    public function setPerfil($perfil)
    {
       $this->perfil = $perfil;
    
       return $this;
    }
    

    之后不要忘记清除缓存。

    另一个建议:

    您绝对应该使用 english 类名、方法名和属性名... 即使您不打算与不会说您的语言的人合作......它也会让任何人都更容易理解您的代码......即使它只是在 stackoverflow 问题中。

    【讨论】:

      【解决方案2】:

      您在 UsuarioType 类中的代码:

      ->add('perfil', new PerfilType())
      

      应该是这样的:

      ->add('perfil', new PerfilType(),array('mapped' => false))
      

      因为您的两个实体类之间似乎没有映射..

      【讨论】:

      • 那里不允许使用 type 选项,我使用的是 Symfony 2.5 btw
      • 不,仍然得到相同的错误getPerfilsetPerfil are not not exist at SysUsuario
      • 你是否在 'perfil' 的名称上完成了 'Usuario' 实体和 'SysPerfil' 实体之间的任何映射..
      • 如果你没有,那么 "try ->add('perfil', new PerfilType(),array('mapped' => false))" //// 见我上面更新的答案。 .
      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多