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 497 Точки

Пробвай да смениш 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 497 Точки

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

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

// Entity/Role.php

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

 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.