Symfony2 - Коллекция форм - Обновление -ManytoMany-Relation

0

Я очень новичок в Symfony2, и теперь у меня проблема с набором форм. У меня есть две Сущности. Пользователь Entity и роль Entity.

Пользователь

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

/**
 * @ORM\Column(type="string", length=25, unique=true)
 */
private $username;

/**
 * @ORM\Column(type="string", length=32)
 */
private $salt;

/**
 * @ORM\Column(type="string", length=250)
 */
private $password;

/**
 * @ORM\Column(type="string", length=60, unique=true)
 */
private $email;



/**
 * @ORM\Column(name="is_active", type="boolean")
 */
private $isActive;

 /**
 * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
 *
 */
private $roles;

Роль сущности

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

/**
 * @ORM\Column(name="name", type="string", length=30)
 */
private $name;

/**
 * @ORM\Column(name="role", type="string", length=20, unique=true)
 */
private $role;

/**
 * @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
 * @ORM\JoinTable(name="user_role",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
 *      )
 */
private $users;

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

контроллер

public function editUserAction($id, Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $user = $em->getRepository('PsoLogBundle:User')->find($id);
    $form =  $this->createForm(new NewUserType(),$user);
    $form->handleRequest($request);
    if (!$user) {
        throw $this->createNotFoundException(
            'No news found for id ' . $id
        );
    }


    if ($form->isValid()) {
        $em->flush();
    $this->get('session')->getFlashBag()->add('notice', 'User updated successfully');
    }

    $build['form'] = $form->createView();

    return $this->render('PsoLogBundle:Security:editUser.html.twig', $build);

}

Теперь у меня есть коллекция форм с пользователем и ролью, которая сохраняется в БД для пользователя. Когда я делаю изменения в роли, я получил ошибку "Исключение произошло при выполнении" UPDATE pso_role SET role =? WHERE id =? ' с параметрами ["ROLE_ADMIN", 2] "

Проблема в том, что Symfony хочет внести изменения в таблицу для роли Entity. На самом деле это должна быть новая запись в таблице для отношения User-Role. Я искал в Google и здесь, в stackoverflow, но я не могу найти то, что мне нужно изменить.

Я думаю, что проблема, возможно, в формообразователе

$builder ->add('username','text', array('label' => 'Username')) 
     ->add('email','email', array('label' => 'Email')) 
     ->add('isActive','text', array('label' => 'User aktiv')) 
     ->add('Roles', 'collection', array('type' => new RoleType())) 
     ->add('Submit', 'submit', array( 'attr'=> array ( 'formnovalidate' => 'formnovalidate' )));

может ли быть, что строка add ("Роли", "Коллекция", массив ("тип" => new RoleType())) определяет объект, который необходимо обновить? Могу ли я изменить это

Если я не использую его с набором форм, но только с одной формой, все работает нормально, потому что тогда затрагивается только одна сущность. Я был бы рад, если кто-нибудь может дать мне подсказку.

Теперь я попробовал его в Formbuilder с → add ('role', 'entity', array ('class' => 'PsoLogBundle: Role', 'property' => 'role'))

Затем я получаю сообщение об ошибке "Ни свойства" роли ", ни один из методов" setRoles() "," __set() "или" __call() "не существуют и имеют открытый доступ в классе" Pso\LogBundle\Entity\User ",.

Я попытался вставить в Entity User установщик

public function setRoles( ArrayCollection $roles)
{
$this->roles = $roles;
return $this;
}    

Затем я получаю сообщение об ошибке ContextErrorException: Catchable Fatal Error: аргумент 1, переданный в Pso\LogBundle\Entity\User :: setRoles(), должен быть экземпляром Pso\LogBundle\Entity\ArrayCollection, экземпляр Pso\LogBundle\Entity\Role given, вызывается в C:\xampp\htdocs\pso\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php в строке 347 и определен в C:\xampp\htdocs\pso\src\Pso\LogBundle\Entity\User.php строка 99

Я попытался решить проблему с помощью

      'multiple' => false,

как я нашел здесь

Но это не меняет ситуацию.

Я добавил в user.php сеттер для роли

// Important
public function setRoles($roles)
{
    foreach($roles as $p)
    {
        $po = new user_role();

        $po->setUser($this);
        $po->setRoles($p);

        $this->addPo($po);
    }

}   

Когда я это делаю и создаю сеттеры и получатели нового, я не получаю ошибки при изменении роли для пользователя, но в БД запись не изменяется.

После многочасового поиска я получил его сейчас. Правильный сеттер прав. Кроме того, я изменил формулятор, как

->add('roles', 'entity', array('class' => 'PsoLogBundle:Role','property' => 'role','multiple' => true,))

Теперь роль изменяется правильно, когда я отправляю форму. Спасибо, что всегда отвечал, так что я получил правильное направление. Надеюсь, теперь все будет хорошо.

Приветствие Micha

  • 0
    Я думаю, что проблема, возможно, в formbuilder [code] $ builder -> add ('username', 'text', array ('label' => 'Username')) -> add ('email', 'email', array ('label' => 'Email')) -> add ('isActive', 'text', array ('label' => 'User aktiv')) -> add ('Roles', 'collection', array ( 'type' => new RoleType ())) -> add ('Submit', 'submit', array ('attr' => array ('formnovalidate' => 'formnovalidate'))); [/ code] может это может быть, что строка add ('Roles', 'collection', array ('type' => new RoleType ())) определяет сущность, которую следует обновить? Могу ли я изменить это
  • 0
    Можете ли вы добавить этот код в свой ОП?
Показать ещё 2 комментария
Теги:

1 ответ

0
Лучший ответ

Вы должны иметь в своем пользовательском объекте:

    /**
     * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
     * @ORM\JoinTable(name="role_assigned_to_user",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
     *      )
     */
    private $roles;

В вашей роли:

    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
     */
    private $users;

в конструкторе ролей:

    public function __construct() {
       $this->users = new \Doctrine\Common\Collections\ArrayCollection();
    }

Вместо коллекции он будет выбирать несколько:

->add('roles', 'entity', array(
            'class' => 'YourBundle:Role',
            'property' => 'name',
        ))
  • 0
    Спасибо за вашу подсказку. Ситуация не меняется. Когда я создал сущности, я сделал это как symfony.com/doc/current/cookbook/security/… . Это был правильный путь? Или ваш способ определения является правильным или лучшим способом?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню