В настоящее время я работаю над проектом Symfony2. Он основан на Sonata и использует SonataUserBundle/FOSUserBundle для управления пользователями. Первоначальная разработка была сделана плохо, и я нахожусь в процессе рефакторинга многих из них.
Приложение определяет три уровня пользователей:
- Администраторы
- Консультанты
- Предприятия
Они определяются как группы с FOSUserBundle, и к ним привязано множество ролей.
Теперь везде в коде предыдущие разработчики использовали (жестко закодировали) идентификаторы баз данных групп, чтобы сделать такие случаи:
$userGroup = $em->getRepository('ApplicationSonataUserBundle:Group')->findOneByName($group_name);
$userGroupId = $userGroup->getId();
if ($userGroupId == 1) {
// Administrator case
...
} else if ($userGroupId == 7) {
// Consultant case
...
}
Это явно очень плохо.
Моя проблема в том, что я уверен, как я могу реорганизовать это по-хорошему.
Я вижу три возможных способа сделать это:
Работа напрямую с определенными ролями: ROLE_ADMIN, ROLE_CONSULTANT, ROLE_BUSINESS;
По-прежнему используйте группы, но оставьте некоторые константы с именем группы, чтобы не повторять их повсюду;
Используйте многопользовательскую систему поверх FOSUserBundle. Я быстро просмотрел RollerworksMultiUserBundle и Многопользовательский пакет PUGX. Хотя я не знаю, не слишком ли это накладно, поскольку мои пользователи на самом деле делятся одной и той же информацией.
Если вы, ребята, можете указать мне в правильном направлении, это было бы очень признательно. Может быть, есть совершенно другой способ добиться этого правильно.