В настоящее время я работаю с Symfony 3.4.
Я читал, что не рекомендуется помещать услугу в класс сущностей. Зачем ?
Представьте, что у нас есть метод saveFile () в этом классе сущностей. В этом методе могут создаваться исключения, поэтому мы помещаем блок try / catch, а в блок catch мы хотим записать исключение. Для регистрации исключений нам нужно использовать службу ведения журнала, но мы не можем, потому что это не рекомендуется.
Итак, наконец, мы должны переместить блок try / catch в контроллер, чтобы получить сервис в блоке catch. Мы должны делать это каждый раз, когда вызываем метод saveFile () в контроллере. Разве это не повторяется? Что насчет СУХОГО?
Каков наилучший способ сделать это?
Благодарю.
Symfony использует Doctrine.
В Doctrine реализован шаблон проектирования «Data Mapper».
Это отличается от шаблона «Active Record», который реализует описанное вами поведение, то есть $myEntity->save()
,
Ключевое отличие в этом отношении состоит в том, что в шаблоне отображения данных сущности описывают только структуру данных, которые они представляют.
Они ничего не знают о методе, с помощью которого они переносятся в любое хранилище данных.
В случае доктрины это обрабатывается менеджером сущностей, который возьмет данный объект сущности и отобразит его в строке в базе данных.
Этот подход обеспечивает уровень разделения между логикой, которая хранит / извлекает данные, и конструкциями, которые удерживают их на уровне модели вашего приложения.
Итак, причина, по которой вы обычно не помещаете сервисы, вызовы БД или что-то еще в ваши сущности, заключается в том, что подход, как правило, заключается в том, что сущность передается службам, которые затем отключаются и что-то с этим делают.
Посмотрите здесь некоторую абстрактную информацию о преобразователях данных в PHP: https://designpatternsphp.readthedocs.io/en/latest/Structural/DataMapper/README.html
Также полезно: https://www.culttt.com/2014/06/18/whats-difference-active-record-data-mapper/
Других решений пока нет …