Я изучаю Symfony (3.3), и меня немного смущает Service Container. В первом руководстве лектор показывает методы регистрации, входа, добавления публикации, редактирования и удаления в User, Article Controllers. Затем в другом руководстве они показывают те же методы, но используют контейнер служб (службы пользователей и статей) с User and Article interfaces. Итак .. как лучше всего использовать реализация в Сервисах вместо Контроллеров.






Контроллер должен реализовывать логику применение, например, проверять, является ли это почтовым запросом, или форма отправляется и т. д. Никогда использует DQL или любой SQL-запрос непосредственно внутри контроллера!
РЕДАКТИРОВАТЬ В этом примере я использую метод поиска внутри контроллера, потому что это метод Репозиторий, но я анализирую результат внутри slugify (мой метод обслуживания)
Услуги содержит логику бизнес, такую как форматирование телефонных номеров, анализ некоторых данных и т. д. Конечно, вы можете внедрить репозиторий внутри службы и вызывать внутри него свои методы.
Пример:
//This is a fictive example
public function indexAction(Request $request) {
//Application logic
if (!$request->get('id')) {
//redirect somewhere by example
}
$article = $this->getDoctrine()
->getRepository(Article::class)
->find($request->get('id'));
//Business Logic
$slug = $this->get('my.acme.service')->slugify($article->getTitle());
}
Надеюсь это поможет
«Никогда не используйте DQL или какие-либо SQL-запросы непосредственно внутри контроллера!» << Почему бы и нет? А как насчет методов репозитория, таких как findAll(), findBy() и т. д.
Если вам нужно написать какой-то DQL, он должен быть в Репозиторий! Вы можете использовать find, findAll и т. д. Внутри контроллера это метод Репозиторий. РЕДАКТИРОВАТЬ НО, если вам нужно проанализировать данные из этих методов, они должны быть внутри службы, как в примере. Или же можно напрямую вызвать метод репозитория внутри сервиса! Цель состоит в том, чтобы ваш контроллер оставался простым.
Я знаю, что о DQL всегда в репозитории, но я имею в виду, откуда вызывать эти методы DQL, опять же Services, или зависит от бизнес-логики / приложения?
Спасибо! Возможно, я приму твой ответ, но буду ждать других ответов. Я также проверяю пример для ввода репозитория в сервисный контейнер
Ответ строгий и подходит не для всех ситуаций.
Я хотел бы добавить к ответу Александра, что рекомендуется держать ваш контроллер «тонким». Другими словами, помещайте в ваш контроллер только тот код, который действительно должен быть там (или если имеет смысл поместить его только в ваш контроллер).
Сервисы похожи на инструменты, которые вы можете использовать в своем приложении. Сервис в объекте, который помогает вам что-то делать. В одном сервисе вы можете иметь множество функций. Я думаю, что лучший способ понять разницу - это то, что контроллер предназначен для одного конкретного действия, а служба может использоваться во многих действиях. Поэтому, если у вас есть части кода, которые вы хотите использовать более чем в одном контроллере, создайте для него службу. И для удобства повторного использования создайте в своем сервисе функции, которые выполняют только функцию один. Это упрощает использование этих функций.
В нескольких словах Контроллер - одно конкретное действие, Сервис снова выполняет одно конкретное действие.
одна из целей обслуживания - уважать философию СУХОЙ.
@MorganFreeFarm, да, но методы обслуживания - это действия, которые вы можете повторно использовать снова и снова в любом контроллере.
«Лучшая практика» зависит от того, что вы хотите делать с Сервисом. Если вы создаете REST-Api, вы можете выполнять операции с базой данных в контроллере. Почему? Когда вы полагаетесь на SOLID-Pattern, вы хотите уменьшить или исключить избыточный код. Если вы кодируете настоящий REST Api, у вас нет избыточного кода, потому что каждый REST-Verb будет выполнять разные запросы / вещи. Таким образом, в приложении, отличном от REST-Api, у вас будет много избыточного кода. Вы делаете одни и те же вещи / услуги на разных страницах / действиях контроллера. Так что лучше всего реализовать всю бизнес-логику в сервисах, чтобы она была только один раз в одном месте. Если у вас много индивидуальных запросов, поместите их в репозитории. Если у вас есть бизнес-логика, которая вписывается в класс сущности, поместите их туда. Так что, на мой взгляд, вы можете выбрать толстый контроллер / без сервисного дизайна в API и тонкий контроллер / толстый сервисный дизайн в классических front- / backend-приложениях Symfony. Но еще кое-что: нет абсолютно неправильного способа разработать приложение. Но если вы работаете с другими людьми или хотите запустить приложение дольше месяца (без проблем с его обслуживанием), вам следует выбрать общий шаблон проектирования.
Не голосующий против, но, по большому счету, stackoverflow предназначен для вопросов с реальными ответами. «Лучшие практики» - это не только миф, но и мнения. Есть такие области, как разработка программного обеспечения, которые могут быть более подходящими.