Конспект курса Symfony Елисеев

icon picker
Архитектура

Однотипные контроллеры. Перенос одинакового бизнес действия в сервисы

Контроллеры по сути являются некой точкой входа, пользовательским интерфейсом. Для какого-то одного бизнес действия может быть несколько этих точек входа.
Например, создание нового юзера может быть в разных контроллерах:
Web. Обработка формы и ее валидация
API. Пока не понял разницу
Консоль CLI. Здесь нужно обрабатывать I/O
Обработка сообщения из брокера очередей
И нашей действие повторяется в этих контроллерах. Поэтому его можно вынести в сервис и вызывать этот сервис во всех контроллерах. Таким образом избавимся от дублирования. И также создадим два уровня, которые связаны через DTO

DTO как мост между уровнями приложения

Как я понял, то контроллер и сервис представляют из себя разные уровни и они не могут знать про друг друга. Точнее один вызывает другого, но должна быть некая прослойка для их связи. То есть сервис всегда должен объявить структура для данных в которые него передаются и контроллеры должны подчиняться этой структуре. То есть эти два уровня делают совершенно разные вещи и не должны знать, что внутри каждого твориться. Но они должны связаны быть некой одинаковой структурой, чтобы разные контроллеры могли спокойно общаться с сервисом.
Это как разные страны, которые внутри себя говорят на разных языках, но хотят торговаться. Одна делает технологии, а другая добывает ресурсы. И каждый из них не знает, как именно другая страна что делает с этими вещами. Но при обмене они договорились, что нужно отправить такие-то технологии и получить такие-то ресурсы. Эта договоренность, этот протокол и есть этот мостик по обмену данными
И возвращаясь к программированию, то DTO выступает этим мостиком. Сервис объявляет через DTO свои ожидания, что ему нужно строго такие данные и контроллеры вынуждены свои любые действия в результате подводить под эту структуру. Таким образом сервис вообще не ебет чо там делают вокруг него другие, он просто ожидает определенные данные.

Что такое доменная модель и модель в широком смысле слова

Именно доменная модель - это не просто какая-то объект один, это в широком смысле вся наша система, ее ядро, основное с чем мы работаем. Предметная область??? При этом в MVC модельками называют конкретный класс, то модель может быть и более широким понятием. По сути один объект тоже может быть моделью, а модель всей системы может состоять из других моделей. То есть некая вложенность

Модель солнечной системы

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

MVC. Что тут модель?

В том же MVC я привык, что модель - это обязательно один класс. Но почему? Ведь модель может быть широким понятием и включать себя сущности и сервисы разные. То есть модель бух. Учета, должна делать много вещей и для этого модель не помещается в один класс. Но то что она в разных классах не перестает быть модель конкретной вещи

Три слоя

Елисеев немного про слои рассказал, но как-то смято и не уверенно))). На примере простого контролера, который вызывает сервис, где создается юзер. И получается три слоя
UI(пользовательский интерфейс) - это собственно контроллеры. Не привычно, что контроллер является интерфейсом. Но по сути ведь юзер посылает свои реквесты именно в контроллер и контроллер выдает ответ именно в понятном виде для юзера
Application. Слой, где происходит работа сервисов. Насколько понял, то в этом слое мы работаем с нашей модель(в широком смысле модель). Как бы управляем ее. При этом модель остается в отдельном слое
Собственно domain model слой. То что мы моделируем, “предметы” нашего приложения, его суть. Собственно это сущности и мб что-то еще. Сейчас у Елисеева очень простой пример на видео
Но Елисеев не особо хочет делить приложение на такие “подробные” слои))) Но посмотрим чо дальше будет. Мб в этом есть какой-то смысл. Пока немного разочарование, что он нормально не рассказывает про а

Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.