Павел
Писал на cordova, пишу на capacitor. Полёт нормальный. Разработка куда дешевле, чем иметь два штата разработчиков на обе платформы.
Это понятно что дешевле. Ещё дешевле делать сайты на готовых админках, wp, без отдельного фронта. Но серьёзные проекты как то все больше без этого стараются, так как гибкость ниже, а ещё более серьёзные даже от фреймов стараются отходить. Если бы все было так просто, давно бы всякие котлины и свифты забросили в мобилках.
Null
ДТО разные для этих роутов
Думал об этом. До последнего стараюсь не прибегать к response dto.
Kirill
Почему?)
Null
Это понятно что дешевле. Ещё дешевле делать сайты на готовых админках, wp, без отдельного фронта. Но серьёзные проекты как то все больше без этого стараются, так как гибкость ниже, а ещё более серьёзные даже от фреймов стараются отходить. Если бы все было так просто, давно бы всякие котлины и свифты забросили в мобилках.
На самом деле, у многих есть ошибочное мнение о гибридных приложениях. Это как кто-то ноет о хреновом php, хотя последний раз его видел на 5.2 Нынешний capacitor умеет почти все то же, что и нативка. Доступы ко всем апи обеспечены. Просадок в производительности не наблюдаю.
Null
Почему?)
Ну а нафига, если есть сериалайзер?
Null
Его, обычно, за глаза хватает.
Павел
Вот кстати, ты ж часто умные советы даешь. Есть сущность. Прогоняется нормалайзером кастомным. Как к этой сущности нацеплять доп. информации? Ну, помимо передачи всей этой допы в контекстах.
1. К вопросу выше - делать двунаправленность и не париться. Раз не паритесь с отдельным чтением. В любом случае к этому придёте. Чтение всегда фиг пойми какое и надо лазить везде и всюду за данными. 2. В нормалацзер можно передать что то и через конструктор
Null
Вот да. Начинаю наконец-то понимать, когда двунаправленность оправданная. И вот конкретно в ситуации коммент-его лайки вполне себе может быть оправданной.
Null
Тут главное на вопрос себе правильно ответить, является ли дочерняя сущность неотъемлимой частью родителя.
Павел
Дело как раз не в сериалайзере, а что часто нужно будет в 1 запросе получить данные сквозь 3, 4 сущности. И получается что модель надо будет как раз перегружать и теми же бидиректами ( п.с. я например особо не парюсь по поводу этого), и другим.
Null
Да я начитался НЕрекоммендации доктрины делать двунаправленки и везде так делал. Щас наконец-то начало доходить. Юзер - его комменты - разрывные сущности. Юзер имеет смысл без комментов. Коммент - его аттачменты, лайки и прочее - вполне себе неразрывные и можно делать двушку.
Павел
Тут главное на вопрос себе правильно ответить, является ли дочерняя сущность неотъемлимой частью родителя.
Ничего тут отвечать не надо, так как вы смешали модель чтения и модель записи. Это норм, если это не мешает серьёзно. Разделение - перегруз. Но тогда и не надо сидеть на стуле, что у вас инкаспулированная модель отмечаюшая только за бл
Сергей
Вот да. Начинаю наконец-то понимать, когда двунаправленность оправданная. И вот конкретно в ситуации коммент-его лайки вполне себе может быть оправданной.
Еще можешь денормализовать и в комментах так же хранить количество лайков. Но это скорее для оптимизации подходит. Ну или не париться и сделать двунаправленную связь как писали выше
Null
И еще вопрос. Есть эти самые лайки-дизлайки. Роут получения списка комментов. Мне надо отдавать, какую именно оценку какому комменту поставил конкретно данный юзер. Это вот в нормалайзере наверное не имеет смысла юзать? Или в контексте как раз логично передать текущего юзера?
Null
Ну да. Либо получить текущего из SEcutiry, но попахивает дурно. Лучше явно передавать, в КОНТЕКСТЕ какого юзера мы рассматриваем нормализацию.
Павел
Ну да. Либо получить текущего из SEcutiry, но попахивает дурно. Лучше явно передавать, в КОНТЕКСТЕ какого юзера мы рассматриваем нормализацию.
Ну например в каких нить готовых апи будет тяжеловато передать все подряд в контексте. Наверное юзер сессии звучит норм в рамках контекста, как раз контекст текущей сессии. Но если завуалировать, то можно и какой нить "UserSourceInterface" передать в конструктор нормалазера и через секьюрити потом ипмлементировать, и передавать что угодно тоже. Но смысла нет, это больше так - как варик
Sanan
извините, а вы какую проблему тут решаете
Sanan
я только чат открыл чет нет сил перечитывать
Sanan
нужен пользователя как то определить или что?
Павел
Ну да. Либо получить текущего из SEcutiry, но попахивает дурно. Лучше явно передавать, в КОНТЕКСТЕ какого юзера мы рассматриваем нормализацию.
Про контекст мне говорили, что если его использовать, то не будет кэша нормалайзера. А если не будет кэшей, то все ваши 100 номралайзеров без кэша будут крутиться в поиске нужного на каждый запрос
Павел
Но надо копать и смотреть более точно, но что то такое есть
Null
извините, а вы какую проблему тут решаете
Да я тут изучаю right way, когда нормалайзеру надо дополнительной информации передать. Типа вот есть объект, а ему еще пару полей извне добавляют.
Sanan
для чего?
Sanan
в рамках какой задачи?
Sanan
я просто пробежал чуток по тексту выше, там чет про пользователя текущего и как его опредлить вроде
Null
Ну вот, для примера. Сущность комментария. Нормализуется нормально. Но в 3 роутах, допустим, стало необходимо добавить к списку комментов кол-во лайков под каждым комментом.
Null
А про юзера - это что комментам еще налепить надо, какие именно лайки-дизлайки ставил сам пользователь.
Null
И да, передавать раздельно комменты, отдельно карту лайков - типа отметаем. Допустим, фронт ендер упёрся и хочет "матрешки" в ответе.
Павел
И да, передавать раздельно комменты, отдельно карту лайков - типа отметаем. Допустим, фронт ендер упёрся и хочет "матрешки" в ответе.
Имхо, как только переходит их раздела простого "отдать сущность максимум в 1 глубину" и много строк, лучше переходить на голый sql. Там потому что и гидратор начинает норм жрать и жадную надо подключать везде принудительно. И всякую эту магию делать.
Sanan
аа, ну смотри, для начала ты должен знать что за пользователь к тебе пришел смотреть ту или иную информацию, ну тут легко его определить. ну это чтобы понять он свои комменты хочет смотреть или чужие и какие у него права над комментами. Потом в сущности коммента я думаю у тебя наверняка есть подключенные коллекции с лайками и дизлайками. и и вот их можно как раз выдавать вместе с комментом в разных ситуациях по разному. например, если с фронта запрашивается один конкретный коммент, можно к нему одну инфу загрузить, а если запрашивается эта сущность коммента в другом запросе, как список комментов - то другую инфу подгрузить. т.е можно как ты хочешь и небольшой объект на фронт вернуть, и матрешку с кучей вложенной инфы
Null
XD как будто монологовский лог ошибки почитал. Вы делаете то-то, вот до сюда.
Sanan
мне че сюда код написать чтоли
Sanan
или неясно как это делать
Sanan
или что
Null
Вопрос был просто не о том, что ты тут описал ) Жизненный цикл запроса, получение юзера, форматы ответа и так было понятно. Мы тут нормалайзер и его снабжение доп. инфой обсуждаем.
Павел
мне че сюда код написать чтоли
Тут уже написали несколько способ включая самого ТС. Вопрос не как сделать, чтобы работало, а как сделать правильно, чтобы потом самому не блеватронить и другие разрабы не запинали, кто в этом разбирается
Sanan
они и позволят снабжать доп инфой все что тебе надо
Sanan
и в нужном объеме
Sanan
у меня есть несколько кастомных билдеров под немного разные задачи, которые генерят sql, можно написать кастомки свои
и не так как это делает доктрина, с кучей лишних запросов и всяким мусором по сути
Sanan
а конкретные запросы без лишнего
Sanan
ну это можно назвать наверное небольшой либой, где под капотом у тебя может быть какая то бизнес логика, которая влияет на генерацию самого запроса и выдачу ответа - разную, в зависимости и от потребности на фронте (разных кейсов)
Sanan
а ответить на вопрос как сделать правильно - ну это холивар
Sanan
один тебе скажет так правильно, другой сяк
Sanan
и можно часами спорить
Dmitriy
))
Sanan
ну и в конце, ты можешь написать какое то решение, и потом отрефакторить его по феншую
Sanan
и никто пинать не будет
Сергей
Вообще, для представления данных, собирать запросы через связи доктрины и запихивать их в нормалайзер, это крайне не экономично, прb 10+ комментариев, у вас на выборку и сериализацию отсчет времени на секунды пойдет. Такие задачи лучше решать через один sql запрос, с последующей пост обработкой. У нас например есть решение когда мы в sql собираем данные по смежным сущностям в поле в виде JSON, дальше парсим в ДТО (своими методами без сарилизатора) и отдаем на фронт, работает быстро на больших объемах и всего один запрос к БД. UserId|UserTitle|EnotherUserFields....|Comments 234441|UserName.|OtherFieldsData......|[{id: 0, comment: 'Hello', likes: [{user_id: 123344, positive: true, time_stamp:'2022-02-02'}]]
Sanan
ну вот, уже псевдо код пошел в ход)))
Sanan
ну так решение сюда может написать сразу
Sanan
Вообще, для представления данных, собирать запросы через связи доктрины и запихивать их в нормалайзер, это крайне не экономично, прb 10+ комментариев, у вас на выборку и сериализацию отсчет времени на секунды пойдет. Такие задачи лучше решать через один sql запрос, с последующей пост обработкой. У нас например есть решение когда мы в sql собираем данные по смежным сущностям в поле в виде JSON, дальше парсим в ДТО (своими методами без сарилизатора) и отдаем на фронт, работает быстро на больших объемах и всего один запрос к БД. UserId|UserTitle|EnotherUserFields....|Comments 234441|UserName.|OtherFieldsData......|[{id: 0, comment: 'Hello', likes: [{user_id: 123344, positive: true, time_stamp:'2022-02-02'}]]
ну вот я про это выше написал, что у меня мини либа, отличается от вашего тем, что там не конкретный sql запрос, а именно билдер, это чтобы он был более функциональным и можно было использовать под несколько схожих задач, для их решения. и в моем случае тоже всего один запрос в итоге получается. а далее - то что ответ можно запихать в дтошки - ну это классика, все так делают.. а эту же мысль услышать еще от одного чела в инете чтобы сделать то же самое... смысл?
Павел
Какой то сюр...
Sanan
ахахахах
Sanan
ну да
Sanan
Динамическое формирование запросов это зло
ну в целом да, если эта динамика непонятно как и че формирует, ну типа как это делает доктрина
Sanan
другой вопрос если эта "динамика" просто подставляет пару вариантов в формирование конечного sql
Sanan
и ты точно знаешь какие там могут быть запросы на выходе, и все их вариации
Dmitriy
если простой запрос то хоть dql, хоть билдер без проблем заходит, потом результаты в дто через NEW если что-то сложнее то нативный sql через dbal и маппинг в дто, что тут еще придумывать
Dmitriy
да вообще пофиг, каждый извращается как хочет с формированием дто, хоть через серилайзер
Юра
Кастом нормалайзер напиши и добавь что надо
Юра
Проверь тип сущности и в нормалазй метоже волен делать что угодно
Юра
А если тип сущности не подходит делегируешь стандартному нормалайзеру
Юра
Точнее в твоём случае ты вызовешь дефолт нормалайзер и добавишь туда инфу
Юра
Только там нужен будет хак с контекстом чтобы избежать рекурсии
Dmitriy
Как мило
Иван
да отдавайте уже просто дто с публичными полями пыха их самостоятельно в джейсон гонит
Юра
Кто-то использовал? https://spiral.dev/
Юра
Это же получается какой-то идеальный фоеймворк. Пхп. Скорость. Нормальная ОРМ. Сервис контейнер
Юра
Ну чтобы понять надо попробовать, но выглядит как спасение из этого застоя
Юра
И заодно становится понятно зачем jit