Все это время ты использовал модели неправильно

Поделиться
HTML-код
  • Опубликовано: 5 сен 2024

Комментарии • 191

  • @DmitryAfanasyev
    @DmitryAfanasyev  2 года назад +8

    Ранний доступ к новым видео в телеграм-канале:
    t.me/i640kb
    t.me/i640kb
    t.me/i640kb

    • @kriptosalo
      @kriptosalo 2 года назад

      Там 11-я версия apiato релизнулась)

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Спасибо, надо глянуть 👍

  • @user-ug8ss4gl7m
    @user-ug8ss4gl7m 2 года назад +33

    Дмитрий, хочу выразить тебе огромную благодарность. По твоим видео, я научился работать с Laravel, и нашел работу, став разработчиком на Laravel, Vue, прошел после первого собеседования. У тебя лучшие видео на RUclips.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +3

      🙏

    • @vadimnv8608
      @vadimnv8608 Год назад

      поддерживаю. Со мной так же сложилось 2 года назад, правда не с первого раза. Лучший

  • @user-po3id7ee7n
    @user-po3id7ee7n 2 года назад +16

    Я к такой архитектуре в голове пришёл с пол года назад и после её внедрения на практике сразу отказался. (для лары)
    1. Если ты работаешь с ларой - ты работаешь с ларой. Что такое лара? Быстро поднять приложение легкой и средней сложности. Ключевое слово быстро, т.е. дешево.
    2. Большинство ларавель программистов не ахти развиты в архитектуре(имхо). Просто потому что лара не заставляет думать. Это такая фишка фреймворка. И каждый новый прогер на проекте будет страдать. А вместе с ним страдать и ревьюверы, пытаясь донести ему где пахнет.
    3. Ларавель такой монолитный фреймворк, что выпилив из него всю магию моделей ты превращаешь его в симфони. Тогда вопрос, почему бы сразу не писать на симфони, который чище на порядок?
    4. Пакеты лары жёстко завязаны на модели и писать свои обработчики нарушает п.1 К примеру, аутентификация дергает пользователя, т.е. работает с моделью напрямую. Это уже нарушение архитектуры. Это можно обойти, но тогда юзера надо хранить как ДТО. Окей, храним как дто. Как мы будем писать политики? Никак. Окей, пишем свои политики. Как мы будем слушать события модели? Никак. Окей, пишем свои события, пишем команды и приближаемся к cqrs. И так далее. Суть ясна.
    5. Шансы что когда-то проект на ларе дорастет до того чтобы самовыпилит лару невероятно низок. Поэтому закладывать на старте лара проекта то что ты будешь переобувать орм в дальнейшем сильно нарушает п.1
    В общем, итого моего решения после всех раздумий:
    1. Никогда не писать логику в моделях
    2. Использовать модели только для релейшенов
    3. Сложные запросы дергать репозиторием, простые в 2 строчки напрямую с модели(т.к. она уже и есть репозиторий и в этом сама ирония паттерна репозиториев для лары)
    4. Не имеет никакого смысла создавать дто той же самой структуры что и модель, если ты делаешь с дто тоже самое что и с моделью.
    5. Если руки прям горят в архитектуру - ставить симфони.
    6. Если когда-то захотелось выпилить из своего проекта лару или симфони - то увы, в реалиях пхп это невозможно. Я больше поверю в то что рядом будет переписаны сервисы на другом языке или фреймворке чем то, что вы сможете безболезненно разобрать фреймворк из приложения. Я пытался. Честно) Чтобы отделить приложуху от фреймворка понадобится невероятно огромное количество прокси классов. И это не имеет никакого смысла для бизнеса.
    В чём мораль басни: Прежде чем отступать от канонов фреймворка - 10 раз подумайте, а поймёт ли вас коллега, который сядет писать через год. Или другая студия, которая возьмёт проект после вас. Или другая команда.
    PS чистая архитектура в грязном фреймворке - это очень мило. Как фотка парня в смокинге по пояс в болоте) Отнимите у типового разработчика ларавель возможность дёргать сервис контейнер по любому поводу и он сразу поплывёт. А создавать объекты из сервиса контейнера посреди кода - это лютейший антипаттерн, если что) Единственное место где одобряют его применение - контроллер. Что юзают в симфони. В остальных же местах можно и по рукам получить от ревьюверов.

    • @ivial997
      @ivial997 2 года назад

      +100500 и вообще нафига строить эти уровни когда в итоге приходим к микросервисам

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +1

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

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Микросервисы сейчас активно пидалируются разными образовательными центрами (была недавно волна рекламы в инсте). Полагаю мода. Далеко не всегда они нужны. И поддержка их тоже не так проста. Как по мне, так лучше рядовому разработчику порокачиваться в чистом коде и архитектурах, чем умея только писать говнокод лезть в микросервисы. А внутри микросервисов создавать годКлассы, пропускать реквесты в бизнеслогику и тп.

    • @user-nu8hi3xr7p
      @user-nu8hi3xr7p 2 года назад

      ты прав во многом, но в моделях лучше не писать свою говно логику. Мне кажется создать Репозиторий самое простое что можно сделать а так лично я использую для средних проектов Фасад - Сервис провайдер - Сервис контейнер - Репозиторий. Вообще для мелких проектов можно только репозиторий юзать поверх модели и все так как смысла нет от всей пидантичности

    • @svetlanafsdfsd16
      @svetlanafsdfsd16 2 года назад +2

      1. Никогда не писать логику в моделях - "сколько еще открытий чудных...". Вы пришли к анемичной модели, осталось обратно вернуться к рич модели. Пару легаси проектов с "Никогда не писать логику в моделях", а с логикой в сервисах изменят ваше мнение.

  • @natalya.provkova2002
    @natalya.provkova2002 2 года назад +4

    На последок напишу, что очень комфортно смотреть твой канал)) Чувствуется 100% знание материала и уверенность. Щепотка юмора и харизмы в самую точку)) Смотреть не наскучивает, это как читать интересную книгу. На рабочих проектах использую твои идеи, начиная с паттернов проектирования, заканчивая архитектурой Porto. После этого видео, я предложу тимлиду использовать именно этот способ получения данных. Буду это аргументировать плюсами из видео или просто скину ему этот ролик. Подписан на тебя с курса по Laravel и буду продолжать тебя смотреть даже после возможной блокировки ютуба. Надеюсь ты продолжишь радовать нас новыми видео.
    PS. На телеграм канал подписался)

  • @stabby6521
    @stabby6521 2 года назад +37

    Дим привет, было бы круто посмотреть на минипроект с этими примерами, если есть возможность скинь ссылку плз

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +8

      Есть в планах

    • @user-jv1rh9hy1y
      @user-jv1rh9hy1y 2 года назад +2

      Как раз тоже хотел такой же запрос сделать =)

    • @user-wu3ns6lj4u
      @user-wu3ns6lj4u 2 года назад +1

      Да, хотелось бы увидеть пример...

    • @user-ul6yv9pr8e
      @user-ul6yv9pr8e 2 года назад +1

      значит ждем, заранее благодарен!

    • @dmitry-popov
      @dmitry-popov 2 года назад

      тоже хотел увидеть , слышал только про один реальный проект, там тоже от базы до вью было куча слоев ,проект простой но тормозил жутко. И в разработке не все так гладко.

  • @VajasanaDas
    @VajasanaDas Год назад +1

    Важные темы обсуждаете. Хотелось бы продолжения, надеемся на скорейшее возвращение

  • @DmitroVialkov
    @DmitroVialkov 2 года назад +4

    Большое спасибо за видео. Согласен на все 100%. Единственный комментарий, это на счет сложности. При вводе дополнительных прослоек возрастает сложность структуры, а не просто сложность... Сложность, вот просто сложность. Это всетаки сложность решения задачи, которая превращается в сложность разработки и подержки, тоесть в технический долг. И очень часто усложнение структуры в конечном счете уменьшают сложность разработки и сложность поддержки.
    Частично именно за это мы и любим фреймворки. За некие правила, которые один раз осознав и выучив, ты перестаешь ходить по граблям.
    Лично я давно живу с дополнительным слоем возвращающем структуры. Т.к. это упращает логику работы с данными на порядок. Всегда удобней в контроллере получить чистые данные, и работать с ними, а не странный объект, который возможно поменяется.

  • @maximsmirnov9620
    @maximsmirnov9620 2 года назад +2

    Дмитрий, классный видос. Очень хотелось бы глянуть на практическое применение этих подходов (точнее последний, я думаю, все пользуются первыми двумя 😊), интуитивно понятно, но все же. Очень хотелось бы увидеть применение! В целом, спасибо тебе за твой труд - очень важные вещи рассказываешь!!!

  • @svetlanafsdfsd16
    @svetlanafsdfsd16 2 года назад +4

    Дмитрий, в случае с Doctrine - это data mapper, взгляни на эту идею с той стороны, что никакой бд нет, сохраняем в памяти или файлах. Придет понимание, что "не писать логику в моделях" - нарушает основной принцип - мы не используем логику там, где хранятся данные. Информационный эксперт (Information Expert) - основной принцип Grasp гласит: информационным экспертомявляется объект, обладающий максимумом информацией, необходимой для выполнения назначенных обязанностей. Логика обработки данных должна находится в в том объекте, где есть максимум данных для ее обработки. Причем тут бд - непонятно. Но сразу видет подход ларавельщика с table gateway.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Не понятен комментарий. Похож на нападку и в конце с принежением ценности личности "сразу виден подход ларавельщика table gateway". Как будто контекст остался у вас в голове. Вы пытаетесь сказать что логику в модели писать это правильно? ибо Grasp? Про table gateway тоже не понятно. Это про тот gateway о котором я говорил в видео? Не знал что Роберт Мартин ларавельщик... Интересно он сам знает об этом? Подобное разделение ответственности впервые узнал от Мартина.

    • @svetlanafsdfsd16
      @svetlanafsdfsd16 2 года назад +4

      Вольный перевод статьи Фаулера anemic model
      Действительно, часто эти модели поставляются с правилами проектирования, в которых говорится, что вы не должны помещать какую-либо логику предметной области в объекты предметной области. Вместо этого существует набор сервисных объектов, которые захватывают всю логику предметной области, выполняя все вычисления и обновляя объекты модели результатами. Эти сервисы работают поверх модели предметной области и используют модель предметной области для данных.
      Фундаментальный ужас этого анти-шаблона заключается в том, что он настолько противоречит основной идее объектно-ориентированного проектирования; который должен объединять данные и обрабатывать вместе. Анемичная модель предметной области на самом деле представляет собой всего лишь процедурный дизайн, именно с этим объектные фанатики вроде меня (и Эрика) борются с первых дней существовани

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Делайте, делайте все в моделях. Как вам будет угодно. И расчет зп помещайте в модель и все остальное. И обязательно об этом рассказывайте на собеседованиях.

    • @antonsemenov7176
      @antonsemenov7176 2 года назад

      ​@@DmitryAfanasyev так смысл же не в том, что бы делать все по шаблону (table gateway или ddd) всегда и везде, а в том, когда можно сэкономить и лупануть anemic model. И когда нельзя сэкономить - сделать rich domain с es и чем-нибудь еще)) и да, order может посчитать в этом случае свою цену(правда многое от контекста зависит и бл). Причем заметил такую фичу что если по ddd делать(в силу своих знаний и понимания темы), то юнит тесты очень репрезентативно показывают факапы. В то время как с table gateway подходом все немного сложнее в этом плане.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Так оно и понятно что все зависит от ситуации. Можно и толстые контроллеры делать.

  • @zCubEz
    @zCubEz Год назад +1

    Отличный контент, надеемся вернется )

  • @user-rz1ik9fl2h
    @user-rz1ik9fl2h 2 года назад +1

    Спасибо за видео! Надеюсь, в будущем будет видео: "все это время ты использовал laravel неправильно, создаем абстракцию для всего фреймворка сразу" )))

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +1

      Уже было 😂😂😂 в курсе Porto

  • @Khorsa
    @Khorsa 2 года назад +3

    Дмитрий, ты в начале упомянул, что многие люди выбрасывают из ларавелла Eloquent и ставят Doctrine.
    Это делается как раз для решения проблемы принадлежности сущностей к слою БД.
    В доктрине сущности предполагаются независящими от ОРМ, они по коду - часть чистой бизнес логики и ОРМ-овские аннотации в них нужны только репкам доктрины для рефлексии. Такой подход позволяет избежать костылей в виде гейтвеев и презентаторов и разбивать модель на более внятные архитектурные слои.
    Собственно, одна из хороших практик в симфони - сначала полностью описать бизнес-модель и только потом приделать к ней ОРМ, добавив конфиги в аннотациях или ямле.
    За ролик - лайк и спасибо. Надо будет поближе познакомиться с ларавеллем - уже если там есть такие проблемы, то наверняка есть и преимущества )

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Да, я всю доку проштудировал по доктрине чтобы не попасть в просак (так как боевого опыта с доктриной не имел). И всё же пришел к выводу что таки да, не надо выпускать куски доктрины из слоя БД.

    • @user-gd5mt2cr7p
      @user-gd5mt2cr7p 23 часа назад

      Если исходить из логики чистой архитектуре . То ORM это слой деталей а модель как enitty в центре и нельзя делать зависимость от деталей так что можно спокойно сказать это ошибочное мнение так делать на doctrine. В центре всего должны быть наши сущности для бизнеса а не ORM модели хоть и они удобны как аггрегаты с коробки

  • @danilafrolov8816
    @danilafrolov8816 2 года назад +3

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

  • @levdau
    @levdau 2 года назад +1

    Спасибо за вдумчивые пояснения. Было полезно! 👍

  • @nicefellow7929
    @nicefellow7929 2 года назад +1

    У тебя отличный канал!
    Очень жалею что не наткнулся на него раньше 😭

  • @konstantins.6598
    @konstantins.6598 2 года назад +2

    Здравствуйте, хотелось бы от вас обзор DDD, плюсы, минусы, сравнение с близкими по устройству...

  • @Eugene.g
    @Eugene.g 2 года назад +1

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

  • @nickfist9187
    @nickfist9187 2 года назад +1

    Показали мандалорца в "Книге Бобы Фета" - Дмитрий видео запилил... Праздник!

  • @vesh95
    @vesh95 2 года назад

    Что-то из раздела чистой архитектуры)
    Таким способом стоит попробовать сделать хотя бы один проект или хотя бы компонент, чтобы потом понимать где это лучше использовать а где нет.

  • @sevakpetrosyan8305
    @sevakpetrosyan8305 2 года назад

    Спасибо за видео!) было бы интересно послушать про разные слои

  • @premieraespadaqqq4174
    @premieraespadaqqq4174 2 года назад

    Дмитрий, большое спасибо за то что вы делаете!

  • @phpdevelopercode636
    @phpdevelopercode636 2 года назад

    Очень крутое видео, спасибо. Уверен, не раз еще буду пересматривать.

  • @sifecs8475
    @sifecs8475 2 года назад +1

    Пару вопросов
    1) Ты не раз ссылался на presenter это что такое? я нашёл только вот такую реализацию pdavidhemphill/presenter ну как я понял это обычная обвёртка над моделями она позволяет логику с моделей выкинуть в функционал это-го пакета .
    2) Есть в laravel метод toBase() как мне его использовать со связями заезженный пример есть пользователи а них есть роли в обычном случае поступил бы вот так User::select(['id', 'name'])->with(['roles:id,name'])->limit(10)->paginate(10) всё ок а если я хочу получить не модельки а stdClsss то мне выплёвывает только юзера мне что теперь отказаться от связей и писать через join?
    Только не бей меня я ещё новичок в этом деле
    Пожелание можешь записать подробное видео или мини проект тяжеловесный с использованием вот это-го подхода?

  • @vadimnv8608
    @vadimnv8608 Год назад

    Дмитрий, скажите пожалуйста, сколько вам нужно задонатить, чтобы ты записал курс по swoole(многопоточность, корутины, таблицы, сокет сервер и тд)?. Просто очень крутая китайская штука, решила многие проблемы с производительностью на проекте. Использовал на ощупь, не разобравшись. Хотелось бы поподробнее разобраться.

  • @vesh95
    @vesh95 2 года назад

    На самом деле если для какого то рассчета никаких внешних механизмов не требуется, то можно и моделью это посчитать и презентовать. Ну это только если, допустим, у модели атрибут А умножить на атрибут Б.
    Мы, конечно, можем не понять при первом знакомстве с проектом, что реальный прайс считается через GetOrderPrice, т.к. он висит где то отдельно, но это же самое и дает нам возможность изменить провайдера курса валюты или добавить интернацианализацию при перерассчете

  • @natalya.provkova2002
    @natalya.provkova2002 2 года назад +1

    Есть такой вопрос. Допустим есть абстрактный метод show (Получение статьи по ID), который получает модель в параметр с помощью сервис-контейнера. По логике из урока передавать эту модель таким образом не вариант:
    return view('template', ['model' => $model]);
    Тогда получается то, что нужно будет перед тем как передать в шаблон данные, предварительно прогнать эту модель в Presentator и уже в шаблон вернуть stdClass.
    $data = $this->presentator->model($model);
    return view('template', ['data' => $data]);
    Верно ли я понял?

  • @natalya.provkova2002
    @natalya.provkova2002 2 года назад +1

    Еще 1 вопрос. У меня на проекте не планируется менять ORM, нужно ли мне тогда использовать Gateway? Если нет то должна получиться схема:
    ORM - > REPOSITORY -> PRESENTATOR

  • @user-yy8gb5rw7z
    @user-yy8gb5rw7z 6 месяцев назад

    Я веб-программист с опытом работы больше 15 лет, занимал должности и тимлида и техлида. Хотелось бы высказать своё мнение, касательно темы этого видео. Если программист начинает разработку без моделирования, то это очень, очень плохо. А если программист ещё изначально пишет код, который нуждается в рефакторинге - ещё хуже.
    Да, нужно понимать, что 80% времени программист исправляет ошибки в коде, свои или чужие, но если при разработке нового функционала не происходит хотя бы незначительные потуги в UML, то этот код через незначительное время придётся дебажить уже другому программисту.
    Вывод, рисуйте диаграммы и большая часть проблем решится в самом начале, а кодирование - это самая простая часть инженерии.
    На эту тему можно почитать С. Макконнелла "Совершенный код".

    • @DmitryAfanasyev
      @DmitryAfanasyev  4 часа назад

      Есть разные подходы. Вы описываете Предварительное проектирование. А есть еще и Эволюционное. Так же не понятно как ваш коммент относится к теме видео...

  • @artemgiant
    @artemgiant 2 года назад

    Бро, просто, лучший как всегда )

  • @Oleksii-k7
    @Oleksii-k7 Год назад

    Дмитрий почему перестал записывать ролики?

  • @c0ntrall472
    @c0ntrall472 7 месяцев назад

    Вопрос: если репозитории служат только для выборок данных, а напрямую обращаться к модели не следует в сервисах то какой слой использовать для Create, Update, Delete операций?

  • @erlanoramalov4857
    @erlanoramalov4857 Год назад

    ООП, вы хотели всего лишь банан, но в результате получаете гориллу, держащую этот банан, и все джунгли впридачу.

  • @user-ei6jg4yi5z
    @user-ei6jg4yi5z 2 года назад +1

    Спасибо Дмитрию за его подачу информации! Вопрос по репозиторию. В нем можно только операцию по чтению проводить или полный CRUD. И если только чтение то где совершать остальное ? Заранее спасибо.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +2

      Можно по разному.
      1) Сам процесс сохранения идет в репозитории, который используется в отдельном классе, например UpdateUserTask($userData).
      Класс готовит данные, отправляет в репозиторий и репозиторий делает только save() без какой- либо логики.
      2) Если нет идеи абстрагироваться от ОРМ, и репозиторий сожержит методы типа "ДаймМне10ПользователейКоторыеОтписалисьОтРассылки" то save можно вызвать у модели в UpdateUserTask
      3) Есть практика когда делают 2 репозитория на одну сущность -1) Репозиторий только на выдачу 2) Репозиторий только на сохранение.
      Главное не помещать логику сохранения, а она может быть очень сложной, в сам репозиторий.

  • @alisher.sabirov
    @alisher.sabirov 2 года назад +1

    Дима, привет, последнее видео 4 месяца назад выкладывал ты))
    Как будет время сделай пожалуйста свежие туториалы по работе с API на ларе. Спасибо

  • @user-hv8kp2oh6f
    @user-hv8kp2oh6f 2 года назад

    Дмитрий, добрый день! Выражаю огромную признательность вам за труд! Я почерпнул для себя массу нового и дошел до многих разных вещей! Прошу помощи разобраться с одной штукой, с которой давно хочу разобраться. Пересмотрел, пожалуй, все ваши видео тут на канале, если где-то об этом уже сказано, то, вероятно пропустил, и буду признателен за ссылку. Тема такая. Что такое "бизнес-логика"? Что вы понимаете под этим по сути? Тут кроме самого определения мне очень интересно разобраться - где же она должна быть? В каком слое приложения? Вы постоянно говорите, что контроллер должен быть тонким (совершенно согласен), что модели не должны содержать бизнес-логики (согласен), в билдерах, мостах, прокси, дто и т.д. ей тоже не место, так куда же ее выносить? Если следовать Porto, то - в таски? Тогда подвопрос: таски могут обращаться друг к другу, но само по себе обращение - это ведь тоже логическая связь, подчиненная каким-то законам бизнеса? К таскам можно обращаться из тасков другого модуля или контейнера, или из "акшонов", тогда получается размазывание бизнес-логики? А если не следовать Porto? Буду признателен за комментарий к моему вопросу.

  • @topalek
    @topalek 2 года назад

    Спасибо за видео, продолжай!!!!

  • @ivan_adamovich
    @ivan_adamovich 2 года назад +1

    Дмитрий, сделайте пожалуйста урок по AWS S3, (всё же это best practise по хранению файлов на сервере) документация достаточно бедная на эту тему, особенно что касается использования загруженных файлов. Спасибо :)

  • @user-wh9yb1rr3i
    @user-wh9yb1rr3i 2 года назад

    Благодарю за инфу

  • @pro100deman
    @pro100deman 2 года назад +1

    Вы рассматриваете всё это только в разрезе паттерна ActiveRecord, Doctrine использует паттерн DataMapper который как раз возвращает чистый объект который сам разработчик может наделить бизнес логикой. И как мне кажется не вся бизнес логика должна быть вынесена из модели, если эта логика зависит только от бизнес модели и не обращается к бд и внешним сервисам. По вашей логике модель это просто массив с полями.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Нет, я не рассматриваю все в разрезе AR. Для доктрины подобный подход так же подходит.

    • @pro100deman
      @pro100deman 2 года назад

      @@DmitryAfanasyev Я правильно понимаю, что получится анимичная модель? И если у нас есть связь 1:м или 1:1 мы явно сделаем 2 вызова, то есть обратимся за моделью, а потом за связанными моделями? И если можно ещё вопрос как вы решаете транзакционное сохранение данных в бд?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Не понятно про связи и получение данных. Оно никак не изменится - как запрограммируете, так и будет...

    • @pro100deman
      @pro100deman 2 года назад

      @@DmitryAfanasyev В доктрине получив модель мы можем обратится к полю которое является коллекцией, внутри произойдёт магия и запрос в бд и вернётся коллекция моделей, если я правильно понял вашу идею с stdClass, то внутри он содержит только поля и не содержит никаких магических эффектов и коллекций, или это не так и модель может содержать вложенные коллекцию ?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Идея не моя, а Роберта Мартина, об этом я написал в описании к видео. На выходе мы должны получить - примитив. Простую структуру данных. Не вижу ничего страшного если некое отношение превратится из модели так же в примитив. Суть в том что нам для работы от БД нужны данные, не более. Не механики расчёта зп, цен и тп. Данные нужны. Вот и получаем данные.

  • @winstonwolf2981
    @winstonwolf2981 2 года назад +1

    Спасибо за видео.
    P.S. вес поднабрал?)

  • @user-hs9jm2ph1w
    @user-hs9jm2ph1w 2 года назад

    как всегда шикарно !

  • @ukraineintheworld722
    @ukraineintheworld722 2 года назад +1

    Гос услуги vs Eloquent. Не факт что гос услуги продержатся дольше Eloquent.

  • @user-uh1rm8py7b
    @user-uh1rm8py7b 2 года назад

    Как всегда, полезно

  • @user-so6jd8ge4s
    @user-so6jd8ge4s 2 года назад

    Про пользователя и зарплату было мощно))))

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Реальный кейс был описан ))))

  • @MrRashdor
    @MrRashdor 2 года назад

    Спасибо за ролик.
    Подскажите, пожалуйста, и в уроках по ларе, и тут речь ведется о селектах. Хорошо, я договариваюсь в проекте работать с моделями в особом слое, где на самом нижнем уровне конкретная ОРМ, а перед ней репозитории, гетвэи и презентаторы, на выходе получаю структуру данных, тут всё понятно.
    А как в такой схеме будет выглядеть вставка и обновление модели? Какие сущности в этом слое будут отвечать за эти процессы, может кто-то доступно объяснить? По схеме получается, что это ответственность репозитория или я не прав?

  • @ardixq
    @ardixq Год назад

    Дмитрий, мне вас не хватает

  • @slikeiv4477
    @slikeiv4477 2 года назад +1

    Спасибо большое за познавательный урок, вопрос, будет ли пример реализации этого подхода в виде кода. Очень интересно посмотреть именно вашу реализацию. Ещё такой вопрос, если проект большой, и следует DDD, то сущность не должна быть анимичной, необходимо как можно больше сократить использования сеттеров и использовать методы жизненного цикла сущности, в случае использования вашего подхода получится ли создать и использовать богатую модель? Если выбирать Doctrine, то лучше сразу выбирать symfony по моему мнению.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +1

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

    • @pnoper
      @pnoper 2 года назад

      @@DmitryAfanasyev "Не вижу сложностей кроме указанных в видео для создания крупного примитива модели (с отношениями и тп)". Вот тут можно чуть подробнее куда копать? Хотелось бы сделать что то такое "AnyModel::select(['field1', 'field2'])->with('anyRelation')->toBase()->paginate(5)", но на выходе нету никаких релейшенов и кастомных аттрибутов. Сам "toBase" классная штука. Использую в репозиториях, когда нужны простые данные. Но вот когда нужны связи и аттрибуты "toBase" уже не справляется.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      То о чем ты говоришь это самый примитивный способ - чтобы сразу из запроса получить примитив. toBase отработает только с обычными полями, toArray может захватить и аксессоры те, которые были добавлены в свойство appends, далее массив можно превратить в stdClass например. Не знаю может ли toArray захватить и отношения - надо проверять.
      Второй способ использовать спец классы - презентаторы, которые будут трансформировать модель в требуемую структуру данных.

    • @pnoper
      @pnoper 2 года назад

      @@DmitryAfanasyev про to array знаю. С атрибутами кастомными проблем нет. Но очень смущает сам факт, что сначала запросом вытаскиваются все модели, потом они перегоняются в массивы, а следом их надо ещё и в stdClass перегнать и дальше ещё во вьюхе сделать цикл для вывода.. Выглядит как то не очень. Уже обнадёжился может какой секрет знаешь, как можно сделать это просто. Походу только презентаторы остаются, как вариант.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Передавать модель во вьюху, как по мне, жесть полная. Был свидетелем того как тащили модель заказа с 30+ полями во вьюху и там брали только ид....

  • @user-du2rq4yl6f
    @user-du2rq4yl6f 2 года назад

    Классы всё-таки должны называться существительными (GetOrderPrice и тд это таки глаголы).
    А в остальном большое спасибо за видео)

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Таки да, перепроверил у Мартина в "Чистый код" - существительные. Не глаголы. Спасибо за замечание.

    • @ev_geniy17
      @ev_geniy17 2 года назад

      До тех пор пока это не Porto где действия и задачи вынесены в отдельные классы.

    • @ev_geniy17
      @ev_geniy17 2 года назад

      Вот вопрос как будут выглядеть useCase если классы можно называть только существительными

  • @Oleksii-k7
    @Oleksii-k7 Год назад

    Кто пример покажет?

  • @dfadfsdfsdsa4283
    @dfadfsdfsdsa4283 Год назад

    А почему не написать ОРМ где можно только определеные поля загнать в модель и если их потом пытатся взять то ексепшн. Плюс если через joinы пытаемся вытащить данные с разных тамблиц, то создавать много моделей сколько нужно под данные. Тогда всего этого не будет

  • @sashasss7114
    @sashasss7114 2 года назад

    Подскажите, как в laravel заставить toBase() работать с with(). C toArray() работает нормально, а с toBase() не хочет.

  • @Shakalakalalala
    @Shakalakalalala 2 года назад

    Не настаиваю на логике работы с моделями и коллекциями, но мы лишаемся целого пласта валидации на уровне типов в таком случае. Считаю, что это самый важный минус

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Не понятно. О какой именно валидации идет речь? Можно примитивный пример?

    • @ev_geniy17
      @ev_geniy17 2 года назад

      @@DmitryAfanasyev в модели имеется cast который удобно использовать в качестве приведения типов

    • @ev_geniy17
      @ev_geniy17 2 года назад

      Слой сущностей который возвращает презентатор тоже лучше создавать с полями предопределенного типа и наделять его нужной бизнес логикой

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Работа с этими полями не изменится как и с мутаторами и аксессорами. Но только в слое бд.

  • @user-dh6bi3ke3w
    @user-dh6bi3ke3w 2 года назад

    не знаком честно говоря с шаблоном Presenter, но вроде две DTO на Request и на ORM сделают тоже самое?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Не понятно про две DTO.

    • @user-dh6bi3ke3w
      @user-dh6bi3ke3w 2 года назад

      @@DmitryAfanasyev - есть работающая REST система. Есть фронтендщики. Есть БД отдельно. И тем и другим периодически взбрыкивает менять имена полей. Всмысле все приходящие данные из вне системы приходится конвертировать в понятные системы поля

  • @palvic02
    @palvic02 2 года назад

    А можно примеры на конкретных данных, типа было/стало?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Был такой вопрос и был ответ. 1) toBase, toArray 2) отдельный класс - презентатор, который на вход получает модель, на выходе примитив. Все максимально просто.

  • @andreytarasov4418
    @andreytarasov4418 2 года назад

    Крутой мерч 😉

  • @skinnyman23
    @skinnyman23 2 года назад

    а что за программа использовалась для презентации подскажите пожалуйста?!

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +1

      Я в видео прямо в схеме уже ответил на этот вопрос - xMind

  • @sergefenix
    @sergefenix 2 года назад

    Спасибо_

  • @alexbendler943
    @alexbendler943 2 года назад

    лайкос, заходЫ...

  • @nbrains6380
    @nbrains6380 2 года назад

    Вся суть опять создать прослойку, прослойки и тд. :) По поводу коллекции ее я думаю можно и передать, какая разница класс который наследует, так же может преобразовать структуру данных в коллекцию.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +1

      Я и не говорил что коллекции не надо возвращать. Коллекции МОДЕЛЕЙ не надо возвращать, а коллекции примитивов - пожалуйста.

  • @progtime2000
    @progtime2000 2 года назад +1

    Реальный пример будет (ссылка на код) или выйдет новое видео?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Есть в планах

    • @progtime2000
      @progtime2000 2 года назад

      @@DmitryAfanasyev Хорошо, будет интересно глянуть!

  • @user-zx1kz5wv2c
    @user-zx1kz5wv2c 2 года назад

    легенда🤙

  • @user-jw9zq8og2j
    @user-jw9zq8og2j 2 года назад

    Почему именно stdClass, а не те же DTO? Вроде бы то, что ты описал - как раз и есть пересылка данных между слоями, где обычно и юзают DTO. Или потому что создание DTO - это дополнительная логика?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Про дто есть видео. Полагаю ответы там.

  • @user-cf6ts2sc5x
    @user-cf6ts2sc5x 9 месяцев назад

    Димон, ну куда пропал?

  • @user-pv9oi6ul4j
    @user-pv9oi6ul4j 2 года назад

    Огромное спасибо!!! Может быть будет нагловато, но все же: а есть возможность по работать с Вами в одной команде и на прямую набраться опыта и получать волшебных обучающих пендалей?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Если вы сильный миддл, то да. Пишите в лс

    • @user-pv9oi6ul4j
      @user-pv9oi6ul4j 2 года назад

      @@DmitryAfanasyev Написал вам на почту

  • @ProsArt
    @ProsArt 2 года назад

    Что такое презентатор и gateway и что они из себя представляют?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Я же в видео рассказывал про это...

    • @ProsArt
      @ProsArt 2 года назад

      @@DmitryAfanasyev видимо запамятовал. Пересмотрел еще раз. Получается под Gateway и Presentator вы имеете ввиду класс-обертки?
      Gateway работает с билдером, возвращаемым из репозитория. Gateway берет на себя обязанность уточнения запроса к БД через доп. параметры.
      А presentator, это класс, который берет на себя обязанность привести модельки к std классу, снимая это бремя с Gateway.
      Верно?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Да, верно.

  • @li.tevezz
    @li.tevezz 2 года назад

    все понятно, но зачем тогда в Laravel параметр роута сразу в модель превращается (например /users/{user}/projects/{project}) ?
    сами приучают народ что в контроллере у же есть модель и с ней можно быстренько что-то поделать)

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Как один из вариантов использования. Если у вас нет целей абстрагировать бизнес правила от деталей - то можно делать и так.

  • @eb6006
    @eb6006 Год назад

    Один из лучших русскоязычных скринкастов по php laravel, возвращайся, куда пропал.

  • @alexanderk8992
    @alexanderk8992 2 года назад

    95% решений, какой подход использовать, принимается в зависимости от время/деньги.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Если нет знаний приемов как и что делать, то сколько бы денег в проект не вкладывали - будет говнокод. И говнокодеры всегда найдут отговорки почему всё плохо. Как сказал доктор Хаус - "знать - круто!"

    • @alexanderk8992
      @alexanderk8992 2 года назад

      @@DmitryAfanasyev так-то да, но если нужно сделать что-то быстро и на коленке, то о каких репозиториях может идти речь

  • @Levelord92
    @Levelord92 Год назад

    Дмитрий, а ты вернёшься на ютуб? Телеграм не находит кстати.

    • @DmitryAfanasyev
      @DmitryAfanasyev  Год назад +1

      Привет. Да, вернусь. А где нерабочая ссылка на телегу? (да, менял урл).
      Вот рабочая t.me/afanasyev_it

  • @ydlf
    @ydlf 2 года назад

    Хотелось бы код увидеть

  • @alexanderk8992
    @alexanderk8992 2 года назад

    Классный видосик.
    Я бы возвращал коллекцию дто со всеми геттерами. Потому что любитель ооп.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +1

      Как сказал Мартин Фаулер - "Вы же не собираетесь сделать страшное и объявлять публичные свойства, так ведь?" )))))

    • @alexanderk8992
      @alexanderk8992 2 года назад

      @@DmitryAfanasyev ага)))

    • @user-lk1fw1lp8b
      @user-lk1fw1lp8b 2 года назад

      дто ничего общего с ооп не имеет.

    • @alexanderk8992
      @alexanderk8992 2 года назад

      @@user-lk1fw1lp8b правда? почему?

    • @user-lk1fw1lp8b
      @user-lk1fw1lp8b 2 года назад

      @@alexanderk8992 дто нарушают инкапсуляцию

  • @koint_TOP
    @koint_TOP 2 года назад +1

    Нам одним харошо

  • @koint_TOP
    @koint_TOP 2 года назад +1

    ЗАЧЕМ ТЫ К НАМ В ШКОЛУ ИДЁ

  • @michaelkovach3894
    @michaelkovach3894 Год назад

    Куда ж он пропал, более года нет видео

    • @DmitryAfanasyev
      @DmitryAfanasyev  Год назад +2

      Скоро вернусь

    • @modymd88
      @modymd88 Год назад

      @@DmitryAfanasyev ждем возвращения!

    • @romanbush5164
      @romanbush5164 Год назад

      @@DmitryAfanasyev ☺💥laravel 9 или 10, а может symphomy

  • @ardixq
    @ardixq 2 года назад

    гений

  • @ivan.silicin
    @ivan.silicin Год назад

    Надо бы пример такого многослойного проекта.

  • @ev_geniy17
    @ev_geniy17 2 года назад

    Лайк не глядя

  • @user-qd6hj2fn4w
    @user-qd6hj2fn4w 2 года назад

    анахуавсёусложнять программирование - это просто!

  • @alexanderk4481
    @alexanderk4481 2 года назад

    Ура ура ура

  • @wickedtorpedo75
    @wickedtorpedo75 2 месяца назад

    Почему перестали выпускать, да понимаю удовольствие от этого мало, но можно раз в 2-3 месяца выпускать чо нибудь полнзное

    • @DmitryAfanasyev
      @DmitryAfanasyev  5 часов назад

      да, надо возобновлять! Спасибо за интерес! (удовольствия на самом деле от этого много. Проф выгорание настигало, настигало и настигло)

  • @koint_TOP
    @koint_TOP 2 года назад +1

    МУРМАНСК

  • @unlike777
    @unlike777 2 года назад

    Все хорошо, но все это ломается о пагинацию или чанки.

  • @alexeyblogprogweb4088
    @alexeyblogprogweb4088 2 года назад

    Это все конечно очень интересно, но без примеров - ни о чем. Только не искусственно подогнанный пример (минипроект) под этот подход, как обычно любят делать, а нормальный. Ларавел очень хорошо подходит для RAD разработки, думаю поэтому куча такого кода. Тяп-ляп - работает и ладно. Поэтому конечно же хочется видеть примеры с нормальной архитектурой, а писать код сейчас может каждый. Некоторые даже не изучая php начинают с Laravel и задают такие вопросы, которые даже к фреймворку не относятся, а относятся к области необходимых элементарных знаний.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Не понятно для чего тут пример? И чем пример малый был бы плох? Вам нужен пример как использовать toBase() ? Да еще и в большом колечестве? Или вам нужен пример как создать класс презентатора который на вход получит модель и выдаст stdClass ? Да еще и в большом количестве? Возможно вам просто еще рано подобные моменты использовать. Но надо просто иметь их в виду. С опытом придет. Цель видео - показать путь и возможности.

  • @timofeysibirskiy443
    @timofeysibirskiy443 Год назад

    Только на днях думал о том, что нехорошо когда модельки свободно гуляют по проекту. Хорошо бы их не выпускать из слоя БД. Собственно, всё как в видео. Решил перейти от теории к практике и попробовать реализовать - не получилось. Расстроился и забросил идею.. а тут смотрю, видео про модельки.. открываю и вах! Значит не всё у меня так плохо, раз сам до такого додумался. Дай-ка, думаю, еще раз попробую. Описал класс сущности, презентатор. Создаю репозиторий и описываю в нём метод findOrFalse($id). Ищу модельку, отдаю её в презентатор и на выходе получаю сущность (тут это вроде как делает Gateway, но по мне так это как раз задача для репозитория. Спорно, но сути дела не меняет). Дописал. Отлично, думаю, выходит! Да не тут то было... Надо мне запись сохранить.. и? Есть экшон. В него пробрасываю ДТОшку и репу в зависимостях. А дальше? Ну, вроде как создать сущность и пробросить её в репозиторий на сохранение. Ага. Только она имеет штук 5-6 полей, а для создания нужно 2. Остальные значения присваиваются при создании модели. Например, таймстемпы. И как быть? Создавать урезанную сущность? Так дтошка уже есть. Пробрасывать её транзитом из экшона дальше в репозиторий? Как-то не очень выглядит.. экшон тогда вообще не при делах. Чёт опять приуныл. Почитал комменты, тож не все доходят. Короче, Дима, пили видос. У тебя это хорошо получается. Ой как нужен видосик новый! Не так тут всё просто как кажется.

  • @koint_TOP
    @koint_TOP 2 года назад

    НЕНАДА

  • @vesh95
    @vesh95 2 года назад

    Метадран))

  • @optimizeit
    @optimizeit 2 года назад +1

    чтож вы забросили канал то!

  • @unlike777
    @unlike777 2 года назад

    При всем уважении и подписки на ваш канал,
    но я считаю Repository это антипаттерн, это полное дно и его вообще нельзя юзать не прикаких абстоятельствах.
    Потом что он финализирует все движения get() и тд
    Оптимально под это все это какие нибудь Criteries или Scopes.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Не понятно почему это антипаттерн - ссылку плз

  • @Valproge
    @Valproge 2 года назад

    Нужно ли в репозиторий выносить селекты, ордеры и лимиты?

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад +1

      Если репозиторий используется как сосредоточение логики запросов. Например имеет методы типа ДайМнеХПользователейКоторыеЗарегалисьНеделюНазадВПолдень. То в репозитории будет обращение к классу модели, построение запроса и получение результата. И да, внутри метода будут where, join и тп. Если репозиторий будет как обертка для ОРМ, с целью иметь возможность не зависить от ОРМ, то появится уже новая сущность UserGateway::ДайМнеХПользователейКоторыеЗарегалисьНеделюНазадВПолдень() и внутри будет работа с репозиторием с помощью которого будет формироваться запрос. UserGateway не будет ничего знать об ОРМ.

  • @vitaliys56
    @vitaliys56 2 года назад

    Щас бы переживать о расходе памяти и юзать ORM.
    Хочется красиво - будет медленнее. Хочется быстрее - будешь прямыми запросами в базу пулять.

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Не совсем так. Получить коллекцию моделей для отчета, допустим, в котором нам потребуются 3 поля из 20 это отвратительно и нисколько не красиво. Красиво указать в запросе эти 3 поля и сделать toBase().

    • @DmitryAfanasyev
      @DmitryAfanasyev  2 года назад

      Да и "пулять" в БД продолжаем через ORM, но в слое БД. Продолжаем использовать всю мощь ORM, но только в слое БД.