Професионална програма
Loading...
OgnjanBoikov avatar OgnjanBoikov 2 Точки

Въпрос относно роли за потребителите

Здравейте

Опитвам се да направя форма с която да менажирам ролите на потребителите.

Използвам начина за ролите от урока на Веселин Малезанов. Имам 3 таблици - users, roles и user_roles

Пропъртито roles в ентито User има следната анотация:

/**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Role")
     * @ORM\JoinTable(name="user_roles",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")})
     * @var Collection|Role[]
     */
    private $roles;

също така в ентитито User имам и конструктор, ще дам и сетърите и гетърите на roles

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

public function getRoles()
    {
        $roles = [];
        foreach ($this->roles as $role){
            $roles[] = $role->getName();
        }
        return $roles;

    }

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

 

При всяка регистрация автоматично слагам роля с id=1, от таблицата roles. Така всеки получава най ниската роля - ROLE_USER. Това работи.

Искам обаче когато админа променя данните на потребителя да може да му промени ролята. Опитвай се да го направя така, давам част от формата за редакция:

 $form = $this->createFormBuilder($user)
            ->add('userName', TextType::class)
            ->add('fullName', TextType::class)
            ->add('cash', TextType::class)
            ->add('usedCash', TextType::class)
            ->add('email', EmailType::class, array('label' => 'E-mail'))
            ->add('roles', EntityType::class, array(
                'class' => 'AppBundle:Role',
                'query_builder' => function (RoleRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->orderBy('u.name', 'ASC');
                },
                'choice_label' => 'name',

            ))
            ->add('save', SubmitType::class, array('label' => 'Save'))
            ->getForm();

Това вече работи дотам, че само ми показва наличните роли. Когато изпратя формата, ми дава следната грешка:

http://www.img-share.eu/f/images/451/errorzsRkLvM44zlHDqvhnCB31513091042.png

 

Доколкото четох, това идва от релацията ManyToMany. Трябвало да я променя. На мен ми върши работа и всеки потребител да има 1 роля, важното е да мога да я променям. 

Идея как да го направя? В краен случай мога да направя някой метод със сурав SQL код и директно да правя заявки към таблицата user_roles. Но ми се струва изключително кофти начин. 

Тагове:
1
PHP MVC Frameworks
dvdty avatar dvdty 484 Точки

Пробвай да смениш ManyToMany ред-а на @ORM\ManyToMany(targetEntity="AppBundle\Entity\Role", inversedBy="users").

 

Roles ти е масив, което значи, че трябва да промениш това:

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

->>>>>>>>>>>>>>>>>>>>>

public function setRoles($role){
    $this->roles[] = $role;
    return $this;
}

 

П.П. Препоръчвам ти да смениш името на функцията от setRoles на addRole, тъй като ти добаваш елемент към масив, не set-ваш целия масив.

 

public function addRole(Role $role){
    $this->roles[] = $role;
    return $this;
}

 

1
12/12/2017 18:13:36
OgnjanBoikov avatar OgnjanBoikov 2 Точки

Много благодаря.

Нямаше нужда от промяната на реда за ОРМ анотацията. 

Направих го така: 

public function setRoles($role){
        $this->roles = null;
        $this->roles[] = $role;
        return $this;
    }

Сега наистина ги сетва.

Премахва другите ако има такива. 

 

 

 

1
12/12/2017 19:03:23
dvdty avatar dvdty 484 Точки

Определяш entity-то което е притежаващо. В случая User entity.

От другата страна слагаш mappedBy - за притежавано entity:

// Entity/Role.php

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

 

0