pokupo
@pokupo
Разработчик, архитектор, предприниматель

Как правильно реализовать модель в Symfony2 на базе MVC?

Я разобрался, что есть в Symfony2 View, а где Controller, но не могу понять где и как создавать свою модель логики? Знаю, что есть сущности доктрины в папке Entity, которые предоставляют интерфейс к БД с геттерами и сеттерами, но ведь это еще не модель. Модель как раз должна описывать всю логику работы и не с одной таблицей данных, а со всеми возможными связями и ограничениями. Но куда выносить эту модель?


Если отдельно в папку Models, то как в классах модели получить доступ к контейнеру служб, чтобы использовать ту же Doctrine, если класс модели не наследовать от Controller (это же модель, а не контроллер!)? Или нужно реализовывать модель «рядом» с Entity, наследуя от них классы? Мне представляется, что основная часть логики должна быть именно в отдельной модели, а не в контроллере или я, что-то не правильно понимаю?


Прошу поделиться знаниями опытных разработчиков по этому вопросу и помочь в этом вопросе.
  • Вопрос задан
  • 14264 просмотра
Решения вопроса 1
JekaRu
@JekaRu
Логику модели обычно выносят в сервисный слой
Для работы с базой используют классы репозитарии.
Сейчас популярен подход похожий на ваш c UserModel, создают класс — менеджер модели, туда инкапсулируют репозитарий модели, EntityManager итд…
Получается очень удобно вынести в него весь сервисный слой.
Примеры:
github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Doctrine/UserManager.php
github.com/KnpLabs/KnpBundles/blob/master/src/Knp/Bundle/KnpBundlesBundle/Manager/BundleManager.php
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Модель в ключе MVC Это просто собирательное от бизнес логики скорее. По сути в Symfony вся логика должна храниться в сервисах.

Entity — это просто как структура данных, сама она логикой тоже может обладать, но минимально, так как ей не доступны сервисы.

Model в контексте форм — это что-то типа Data transfer object, то бишь некий объект, который содержит данные в нужном формате. В большинстве случаев моделью для форм являются сущности.

Контроллеры это просто контроллеры, тут все раскрыто довольно хорошо в документации.

Логику же, если по хорошему, нужно выносить в сервисы. Почти все можно вынести из контроллера в ивент листенеры, отдельные служебные сервисы, хэндреры форм (для дедублицирования кода в контроллерах, правда не часто помогает). Словом, тут все очень и очень зависит от проекта. Но сущность должна только хранить данные, и никак их не изменять. Можно только дополнительные геттеры писать, которые производят небольшие манипуляции с данными.
Ответ написан
Использую доктриновские сущности, нашпигованные методами бизнес-логики. Если для бизнес-логики нужны какие-то сущности, не связанные с текущей схемой данных, то передаю их как параметры методам, предварительно вытаскивая из репозиториев в контроллерах. Сами сущности ничего не знают о хранении их в репозиториях, обычные POPO, вся логика хранения обеспечивается в контроллере.

Сервисы использую когда в методах различных сущностей появляется дублирование кода или просто непонятно к какой сущности отнести тот или иной метод — типичный пример: перевод со счёта на счёт, оба счёта в принципе равноправны, и что метод DebetTo в источнике, что метод CreditFrom в получателе будет выглядеть некрасиво, особенно если будет ещё и третий счёт, на который перечисляется комиссия за транзакцию, а создание класса транзакции в модели нецелесообразно — прямой кандидат в сервисы. Вообще сервисы рассматриваю как функции.
Ответ написан
Комментировать
TrueDrago
@TrueDrago
Если логика относится непосредственно к сущности, взятой из базы данных, я её запихиваю в Entity.
Уж не знаю, насколько этот подход правилен, т.к. сам еще новичек в Symfony, но мне это решение кажется вполне логичным.
Насколько я понимаю, тут Models скорее используются для создания абстрактных сущностей или интерфейсов, чтобы потом от них отнаследовать конкретные реализации, будь то Doctrine или что-то еще.
Ответ написан
TrueDrago
@TrueDrago
В таком случае, либо так, либо как сказали выше, использовать EntityManager (я бы выбрал 2-е в большинстве случаев, но зависит от задачи всё же)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы