Sonata User Bundle с MongoDB настраивают через MongoDB ODM: сначала подключают Doctrine MongoDB Bundle, затем описывают document-модель пользователя, после этого связывают ее с Sonata. Перед настройкой обязательно проверьте совместимость версий Symfony, Sonata User Bundle и Doctrine MongoDB ODM: это не самый простой стек для нового проекта, и часть примеров в сети может относиться к старым версиям
Рабочая логика такая: MongoDB хранит пользователей как документы, Doctrine ODM отвечает за маппинг, Sonata дает административный интерфейс и пользовательскую часть
- Что должно быть в проекте
- Пример document-модели пользователя
- Конфигурация Doctrine MongoDB
- Что проверить после настройки
- Частые ошибки
- Entity вместо Document
- Несовместимые версии пакетов
- Пользователь не сохраняется
- Админка открывается, но данные пустые
- Когда стоит выбрать другой путь
- Что почитать дальше по MongoDB
- Как проверить результат на практике
Что должно быть в проекте
Вам нужны три слоя:
- Symfony-приложение;
- Doctrine MongoDB ODM и MongoDB Bundle;
- Sonata User Bundle с настройкой пользовательского класса.
Сначала убедитесь, что MongoDB запущена и приложение может подключиться к ней через MONGODB_URL или параметры конфигурации
Пример переменной окружения:
MONGODB_URL=mongodb://localhost:27017/sonata_app
Пример document-модели пользователя
Упрощенный пример:
<?php
namespace App\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Sonata\UserBundle\Model\User as BaseUser;
#[ODM\Document(collection: 'users')]
class User extends BaseUser
{
#[ODM\Id]
protected $id;
}
Смысл в том, что пользователь становится документом MongoDB, а не строкой SQL-таблицы
Конфигурация Doctrine MongoDB
Примерно так задается подключение:
doctrine_mongodb:
connections:
default:
server: '%env(resolve:MONGODB_URL)%'
default_database: sonata_app
document_managers:
default:
auto_mapping: true
После этого проверьте, что Symfony видит document manager и может работать с MongoDB
Что проверить после настройки
Проверьте, создается ли коллекция users
Проверьте, сохраняется ли пользователь
Проверьте, открывается ли административный интерфейс Sonata
Проверьте, что класс пользователя указан именно как document-класс, а не entity-класс для ORM
Частые ошибки
Entity вместо Document
Если проект настроен под MongoDB ODM, пользователь должен быть document-моделью. Если случайно оставить ORM entity-настройки, Sonata будет искать SQL-слой
Несовместимые версии пакетов
Sonata, Symfony и Doctrine ODM чувствительны к версиям. Если установка падает на composer-конфликтах, не форсируйте зависимости вслепую: сначала проверьте официальные требования пакетов
Пользователь не сохраняется
Проверьте подключение к MongoDB, document manager, namespace модели и маппинг. Если база доступна, но коллекция не появляется, чаще всего проблема в конфигурации ODM
Админка открывается, но данные пустые
Проверьте, в той ли базе и коллекции вы смотрите данные. MongoDB может быть подключена к другой базе из переменной окружения
Когда стоит выбрать другой путь
Если вы начинаете новый проект и вам нужен простой пользовательский модуль, иногда быстрее собрать авторизацию на стандартной Symfony Security-системе и MongoDB ODM без Sonata User Bundle. Sonata полезна, когда вам действительно нужен административный интерфейс и вы готовы поддерживать связку пакетов
Что почитать дальше по MongoDB
Если нужен общий маршрут по теме, откройте рубрику MongoDB. Для соседних задач пригодятся эти разборы:
- Discord bot на Python и MongoDB: как задать проверку
- Failed to start MongoDB database server: что проверить
- MongoDB Atlas: облачная база для первого проекта
- MongoDB Compass: подключение и первая коллекция без командной строки
Как проверить результат на практике
Для MongoDB-материала полезно делать три проверки: сначала выполнить команду на маленьком наборе тестовых документов, затем посмотреть результат через find() или MongoDB Compass, а после этого повторить действие на копии реальной структуры данных. Если запрос меняет документы, сначала запускайте его с фильтром на один документ и только потом расширяйте условие
Еще одна хорошая привычка — записывать исходное состояние и ожидаемый результат. Например: было три документа, после обновления изменился только один; был массив из пяти элементов, после операции остался нужный элемент; индекс появился в getIndexes(). Такая проверка быстро показывает, что вы исправили именно задачу, а не просто получили команду без ошибки



