Как лучше всего использовать сервисы в Symfony вместо контроллеров и не только там?

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

Не голосующий против, но, по большому счету, stackoverflow предназначен для вопросов с реальными ответами. «Лучшие практики» - это не только миф, но и мнения. Есть такие области, как разработка программного обеспечения, которые могут быть более подходящими.

Cerad 08.08.2018 14:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
471
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Контроллер должен реализовывать логику применение, например, проверять, является ли это почтовым запросом, или форма отправляется и т. д. Никогда использует 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() и т. д.

MorganFreeFarm 08.08.2018 11:23

Если вам нужно написать какой-то DQL, он должен быть в Репозиторий! Вы можете использовать find, findAll и т. д. Внутри контроллера это метод Репозиторий. РЕДАКТИРОВАТЬ НО, если вам нужно проанализировать данные из этих методов, они должны быть внутри службы, как в примере. Или же можно напрямую вызвать метод репозитория внутри сервиса! Цель состоит в том, чтобы ваш контроллер оставался простым.

Alexandre Painchaud 08.08.2018 11:24

Я знаю, что о DQL всегда в репозитории, но я имею в виду, откуда вызывать эти методы DQL, опять же Services, или зависит от бизнес-логики / приложения?

MorganFreeFarm 08.08.2018 11:27

Спасибо! Возможно, я приму твой ответ, но буду ждать других ответов. Я также проверяю пример для ввода репозитория в сервисный контейнер

MorganFreeFarm 08.08.2018 11:30

Ответ строгий и подходит не для всех ситуаций.

codeneuss 25.10.2018 10:08

Я хотел бы добавить к ответу Александра, что рекомендуется держать ваш контроллер «тонким». Другими словами, помещайте в ваш контроллер только тот код, который действительно должен быть там (или если имеет смысл поместить его только в ваш контроллер).

Сервисы похожи на инструменты, которые вы можете использовать в своем приложении. Сервис в объекте, который помогает вам что-то делать. В одном сервисе вы можете иметь множество функций. Я думаю, что лучший способ понять разницу - это то, что контроллер предназначен для одного конкретного действия, а служба может использоваться во многих действиях. Поэтому, если у вас есть части кода, которые вы хотите использовать более чем в одном контроллере, создайте для него службу. И для удобства повторного использования создайте в своем сервисе функции, которые выполняют только функцию один. Это упрощает использование этих функций.

В нескольких словах Контроллер - одно конкретное действие, Сервис снова выполняет одно конкретное действие.

MorganFreeFarm 08.08.2018 11:35

одна из целей обслуживания - уважать философию СУХОЙ.

Alexandre Painchaud 08.08.2018 11:39

@MorganFreeFarm, да, но методы обслуживания - это действия, которые вы можете повторно использовать снова и снова в любом контроллере.

Dirk J. Faber 08.08.2018 11:41

«Лучшая практика» зависит от того, что вы хотите делать с Сервисом. Если вы создаете REST-Api, вы можете выполнять операции с базой данных в контроллере. Почему? Когда вы полагаетесь на SOLID-Pattern, вы хотите уменьшить или исключить избыточный код. Если вы кодируете настоящий REST Api, у вас нет избыточного кода, потому что каждый REST-Verb будет выполнять разные запросы / вещи. Таким образом, в приложении, отличном от REST-Api, у вас будет много избыточного кода. Вы делаете одни и те же вещи / услуги на разных страницах / действиях контроллера. Так что лучше всего реализовать всю бизнес-логику в сервисах, чтобы она была только один раз в одном месте. Если у вас много индивидуальных запросов, поместите их в репозитории. Если у вас есть бизнес-логика, которая вписывается в класс сущности, поместите их туда. Так что, на мой взгляд, вы можете выбрать толстый контроллер / без сервисного дизайна в API и тонкий контроллер / толстый сервисный дизайн в классических front- / backend-приложениях Symfony. Но еще кое-что: нет абсолютно неправильного способа разработать приложение. Но если вы работаете с другими людьми или хотите запустить приложение дольше месяца (без проблем с его обслуживанием), вам следует выбрать общий шаблон проектирования.

Другие вопросы по теме