0

我有这个问题,我无法解决。我是 Symfony 2 的新手。我解释了我的问题。我有一个 Usuario 类和 Group 类。我已经覆盖了 RegistrationForm 以向用户添加组。

这是我的代码

<?php

namespace Backend\UsuariosBundle\Form\Type;

use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

class RegistrationFormType extends BaseType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {


        // agrega tu campo personalizado
        $builder->add('name', 'text', array('label'=>'Nombre Completo de usuario:'));

        parent::buildForm($builder, $options);

        // agrega tu campo personalizado
        $builder->add('roles', 'choice', 
                            array('label' => 'Elige un Rol para el usuario', 'required' => true, 
                                'choices' => array( 1 => 'ROLE_ADMIN', 2 => 'ROLE_USER'), 
                                'multiple' => true))
                ->add('groups', 'entity', array(
                            'label' => 'Asociar al Grupo de',
                            'empty_value' => 'Elija un grupo para el usuario',
                            'class' => 'BackendUsuariosBundle:Group',
                            'property' => 'name',
                        ))


        ;
    }



    public function getName()
    {
        return 'mi_user_registration';
    }
}

我的 Usuario 课程是这样的:

<?php

namespace Backend\UsuariosBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use \FOS\UserBundle\Model\GroupInterface;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="Usuario")
 * @UniqueEntity(fields="username")
 * @UniqueEntity(fields="email")
 */
class Usuario extends BaseUser
{

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=50)
     *
     * @Assert\NotBlank(message="Por favor, introduce tu nombre.", groups={"Registration", "Profile"})
     * @Assert\MinLength(limit="3", message="El nombre es demasiado corto.", groups={"Registration", "Profile"})
     * @Assert\MaxLength(limit="50", message="El nombre es demasidado largo.", groups={"Registration", "Profile"})
     */
    protected $name;

    /**
     * @ORM\ManyToMany(targetEntity="Backend\UsuariosBundle\Entity\Group")
     * @ORM\JoinTable(name="fos_user_user_group",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
     * )
     */
    protected $groups;

    public function __construct() {
        $this->groups = new ArrayCollection();
        parent::__construct();
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Usuario
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }


    /**
     * Agrega un rol al usuario.
     * @throws Exception
     * @param Rol $rol 
     */
    public function addRole( $rol ) {
        $this->roles = array();
        if($rol == 1) {
          array_push($this->roles, 'ROLE_ADMIN');
        }
        else if($rol == 2) {
          array_push($this->roles, 'ROLE_USER');
        }
    }


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Add groups
     *
     * @param \FOS\UserBundle\Entity\Group $groups
     * @return Usuario
     */
    public function addGroup(GroupInterface  $groups)
    {
        $this->groups[] = $groups;

        return $this;
    }

    /**
     * Remove groups
     *
     * @param \FOS\UserBundle\Model\GroupableInterface $groups
     */
    public function removeGroup(GroupInterface  $groups)
    {
        $this->groups->removeElement($groups);
    }

    /**
     * Get groups
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getGroups()
    {
        return $this->groups;
    }
}

表单显示正确,但保存时显示此错误: 属性“组”在类“Backend\UsuariosBundle\Entity\Usuario”中不公开。也许您应该创建方法“setGroups()”?

为什么?一些帮助/想法?

谢谢你的帮助。

4

3 回答 3

1

我想您的经验不足可能会扩展到 PHP 和一般编程。
但是,我们在这里为您提供帮助。

正如错误对你说的那样(当错误真的在说话时,这是一个幸运的情况)你错过了一个名为的方法setGroups()

您应该通过以下方式实现它

    /**
     * Set groups
     *
     * @param Doctrine\Common\Collections\ArrayCollection $groups
     * @return Usuario
     */

    public function setGroups(ArrayCollection  $groups)
    {
        $this->groups = $groups;

        return $this;
    }

此方法与您的类的现有方法有很大不同,称为addGroup; 扩展addGroup现有的组数组,而setGroups()将所有组放入 ArrayCollection 中,如果之前关联了其他组,它们将被覆盖。

Symfony2 表单引擎将默认使用setXXXX(其中 XXXX 是您要添加的属性)方法,因此对于实现它们至关重要。

于 2013-02-18T08:03:09.093 回答
0

@DonCallisto 有点正确,但是您的问题更容易解决并且原因不同。

此外,如果您添加一个 setGroup(),那么您可能会在以后遇到与ArrayCollectionvs a相关的问题PersisitentCollection。对此的修复变得混乱。

Symfony 在这里期望的是,你拥有方法addGroups()removeGroups(). 复数。你有addGroup()removeGroup()

我相信如果你在添加这些行之前生成 getters/setters/adders 会发生这种情况,这会告诉 Symfony 以倍数处理它:

public function __construct() {
    $this->groups = new ArrayCollection();
}

基本上,它认为您一次只能期待一个组,因此它以语法方式设置了 getter/setter。这已更改,Symfony 的语法用法也已更改,但方法名称保持不变。

于 2013-07-11T09:47:49.250 回答
-1

它是自动映射,也许您可​​以添加:

    /**
     * Add groups
     *
     * @param \FOS\UserBundle\Entity\Group $groups
     * @return Usuario
     */
    public function setGroup(GroupInterface  $groups)
    {
        $this->groups[] = $groups;

        return $this;
    }
于 2013-02-18T08:03:15.580 回答