У меня возникла проблема с системой безопасности Symfony2, особенно при попытке загрузить роли из базы данных. Прежде чем идти дальше, я знаю FOSUserBundle, но на данный момент, чтобы лучше понять структуру Symfony2, я хочу попробовать и сделать работу с моими пакетами только с использованием компонентов Symfony2. TL; DR -> пожалуйста, не говорите мне просто использовать FOSUserBundle. :-)Symfony2: загрузка пользовательских ролей из базы данных
У меня есть 3 объекта, настроенные в моем пакете, учетные записи, учетные записи и учетные записиRepository.
ЦСИ \ RedK \ Ядро \ IndexBundle \ Entity \ Accounts.php
http://pastebin.com/0VgXvtJp
ЦСИ \ RedK \ Ядро \ IndexBundle \ Entity \ AccountsRoles.php
http://pastebin.com/GiKNnYg3
ЦСИ \ RedK \ Core \ IndexBundle \ Entity \ AccountsRepository.php
http://pastebin.com/SVuMVdpN
MySQL demo_template.accounts Таблица
http://pastebin.com/YzmjD9e4
MySQL demo_template.accounts_roles Таблица
http://pastebin.com/Ybwr4f7y
Все аспекты пачке были правильно работают (регистрация, подтверждение, сброс пароля, и Логин) прежде чем я попытался добавить загрузку пользовательских ролей из базы данных. Когда я просто устанавливаю роль в массив ('ROLE_USER') через getRoles() {return array ('ROLE_USER')}, выполнялась аутентификация и пользователь успешно вошел в систему.
Однако при попытке интегрировать роли из базы данных, я получаю следующее сообщение об ошибке, что я понимаю, является экземпляром AuthenticationException:
Notice: Undefined index: id in /home/humplebert/Websites/www/template/vendor/doctrine/lib/Doctrine/ORM/Query/SqlWalker.php line 804
Трассировка стека
http://pastebin.com/Sr5RvZaY
за исключением генерируется только при изменении запроса в AccountsRepository и удалении
компонентов «-> select()» и «-> leftJoin()». Посмотрев на Stack Trace, вокруг строки 16 на ссылке pastebin.com, похоже, что у меня есть всевозможные «сумасшедшие», происходящие в отношении сопоставления «многие ко многим» в BasicEntityPersister.
Я искал высоко и низко в своих классах Entity для любой ссылки на простой «id» и не нашел их. Я заметил, что если я изменил имена своих столбцов «ID» в моих сущностях только на «id» (т.е. заменил «AccountsID» на «id» в src \ RedK \ Core \ IndexBundle \ Entity \ Accounts), ошибка (и заменяется другой ошибкой, более подробно об этом в данный момент).
Вопрос 1)
Есть ли что-то blatently неправильно с моим Entities быть генерирование «Undefined индекса: идентификатор» ошибка я получаю? Если нет, то для Symfony2/Doctrine2 требуется, чтобы столбцы Auto-Increment были помечены как «id»?
Как я продолжал возиться, я решил попробовать переименовать столбцы ID таблицы в «id». Следовательно, src \ RedK \ Core \ IndexBundle \ Accounts заменяет AccountsID только «id». Аналогично, src \ RedK \ Core \ IndexBundle \ AccountsRoles заменяет RolesID только «id». При этом ошибка «Undefined index: id» исчезает. Однако, я получаю новую ошибку: "table or view demo_template.accounts_accountsroles does not exist"
. Ну, конечно, этого не существует, у меня нет таблицы, определяемой как account_accountsroles. У меня есть две таблицы, учетные записи и account_roles.
Вопрос 2)
Для того, чтобы использовать инструменты Symfony2/Doctrine2 для импорта ролей пользователей из базы данных, какие правила существуют в отношении имен таблиц? Основываясь на полученной ошибке, кажется, что происходит какая-то форма конкатенации. Или я просто просто испортил свои аннотации где-то вдоль линии?
Любая помощь была бы принята с благодарностью.
Все еще застрял на этой ошибке. Я связываю структуры MySQL для двух таблиц базы данных в надежде, что это поможет пролить дополнительный свет на проблему. –
Вы должны поместить трассировку стека вместо ошибки (т. Е. Сообщения, файла и строки ...). – AdrienBrault
В большинстве баз данных (включая MySQL) для многих отношений требуется третья таблица «соединения». Если вы не укажете имя этой таблицы в своих аннотациях, Symfony генерирует ее, объединяя имена двух объектов - таким образом, таблица account_accountsroles, которая должна существовать, чтобы ваши отношения многие и многие работали. Может быть просто, что ваша схема базы данных устарела или может возникнуть проблема с вашими многочисленными аннотациями. – redbirdo